2010-11-24 3 views
1

Mon code compile mais lance une exception: "Une exception non gérée de type 'System, Access Exception Violation' est survenue dans HealthCareProvider.exe Informations supplémentaires: Vous avez essayé de lire ou d'écrire de la mémoire protégée. AIDEZ-MOI??Une exception non gérée de type 'System, Access Violation Exception' s'est produite dans HealthCareProvider.exe

Le problème est lié à la méthode print(). Je ne sais pas pourquoi. Iterator imprime seulement un tas nombre différent (a besoin toString())

Humblement,

Mike

#ifndef _HEALTHCAREPROVIDER_H 
#define _HEALTHCAREPROVIDER_H 

#include <string> 
#include <iostream> 

using namespace std; 

class HealthCareProvider{ 

public: 

//constructor 
HealthCareProvider(const string &lname, const string &fname, const string &type, const int &yearsExperience, const string &coType): 
lastName(lname),firstName(fname),providerType(type),yearsExp(yearsExperience),companyType(coType) 
{ 
} 

//Last Name 
void setLastName(const string &lname){ 
    lastName = lname; 
} 

string getLastName()const{ 
    return lastName; 
} 

... etc. 

//coType 
void setCompanyType(const int &coType){ 
    companyType = coType; 
} 

string getCompanyType()const{ 
    return companyType; 
} 

void print() const { 
    cout<<"Name: "<< getLastName()<<", " <<getFirstName()<<"\nType : "<<getProviderType()<<"\nYears Experience: "<<getYearsExp()<<" \nCompany Type : "<<getCompanyType()<<endl; 
} 

virtual double billForTreatment() = 0; 


private: 

int yearsExperience, yearsExp; 
string type, coType, lname, fname; 
string lastName, firstName, providerType, companyType; 


}; 

#endif 




#include <vector> 
#include <list> 
#include <iostream> 
#include <iomanip> 
#include <typeinfo> 
#include <iterator> 
#include "HealthCareProvider.h" 
#include "Dentist.h" 

using namespace std; 

int main(){ 

    string value; 

    cout << fixed << setprecision (2); 

    //populate 
    vector < HealthCareProvider*> healthCareProviders (6); 

    healthCareProviders [0]=new Dentist("Thatcher","Donald","Dentist",10, "sole proprietorship"); 

    healthCareProviders [1]=new Dentist("Parker","Michelle","Dentist",5, "LLC"); 

    healthCareProviders [2]= new Dentist("Bradford","Michael","Dentist",12, "LLC"); 

    healthCareProviders [3] = new Dentist("Craig","Elizabeth","Dentist",4, "sole proprietorship"); 

    for (size_t i=0; i<healthCareProviders.size(); i++){ 
    healthCareProviders[i] ->print(); 
    cout<<endl; 
    } 

    for (size_t j =0; j< healthCareProviders.size(); j++){ 
    delete healthCareProviders [j]; 
    } 


    cout<<"Pause . . ."<<endl; 
    cin>>value; 

} 
+0

Avez-vous essayé d'exécuter un débogage et de parcourir le code ligne par ligne jusqu'à ce qu'il se bloque? Cela vous dira exactement où il se bloque. – Goz

Répondre

6

Vous créez un vecteur de taille 6, mais vous avez initialisé seulement les 4 premières entrées . Les deux autres pointeurs sont NULL et c'est pourquoi vous obtenez une violation d'accès lorsque vous appelez healthCareProviders[i] ->print();.

Une solution simple serait d'utiliser vector::push_back pour ajouter des éléments comme nécessaire au lieu de spécifier la taille à l'avance:

healthCareProviders.push_back(new Dentist(...)); 
+0

Oui, pas tout à fait évident pour un novice. +1 –

1

Si vous ré-écrire votre code comme suit:

//populate 
    vector < HealthCareProvider*> healthCareProviders; 

    healthCareProviders.push_back(new Dentist("Thatcher","Donald","Dentist",10, "sole proprietorship")); 

    healthCareProviders.push_back(new Dentist("Parker","Michelle","Dentist",5, "LLC")); 

    healthCareProviders.push_back(new Dentist("Bradford","Michael","Dentist",12, "LLC")); 

    healthCareProviders.push_back(new Dentist("Craig","Elizabeth","Dentist",4, "sole proprietorship")); 

Alors vous n'aurez plus le problème.

Vous initialisez le vecteur pour avoir 6 éléments et ensuite seulement remplir 4 d'entre eux. Si vous souhaitez réserver de l'espace pour pousser plus tard les entrées dans le vecteur, utilisez la fonction "réserve". Ceci alloue la mémoire mais ne change pas la "taille" du vecteur.

+0

Bien que correct, vous n'expliquez pas pourquoi, ce qui est plus important. –

Questions connexes