2010-11-24 6 views
1

Mein Code kompiliert, aber löst die Ausnahme aus: "Eine nicht behandelte Ausnahme vom Typ 'System, Zugriffsverletzung Ausnahme' in HealthCareProvider.exe aufgetreten Weitere Informationen: Versuch, geschützten Speicher zu lesen oder zu schreiben. HILFE??Eine nicht behandelte Ausnahme des Typs 'System, Zugriffsverletzung Ausnahme' in HealthCareProvider.exe

Problem ist mit print() -Methode. Ich weiß nicht warum. Iterator nur aus druckt ein Bündel verschiedene Zahlen (benötigt toString())

Demütig

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

Haben Sie versucht, einen Debugger durchlaufen zu lassen und Zeile für Zeile durch den Code zu gehen, bis er abstürzt? Dies wird Ihnen GENAU sagen, wo es abstürzt. – Goz

Antwort

6

Sie sind ein Vektor der Größe 6 zu schaffen, aber sie haben nur die ersten 4 Einträge initialisiert . Die verbleibenden zwei Zeiger sind NULL und deshalb erhalten Sie eine Zugriffsverletzung, wenn Sie healthCareProviders[i] ->print(); aufrufen.

wäre eine einfache Lösung zu verwenden vector::push_back sein Elemente hinzufügen, wie statt Angabe der Größe vor der Zeit benötigt:

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

Ja, nicht ganz offensichtlich für einen Anfänger. +1 –

1

Wenn Sie Ihren Code neu schreiben, wie folgt:

//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")); 

Dann wirst du das Problem nicht mehr haben.

Sie initialisieren den Vektor, um 6 Elemente zu haben und füllen dann nur 4 von ihnen auf. Wenn Sie Speicherplatz reservieren möchten, um später Einträge in den Vektor zu schieben, verwenden Sie die Funktion "Reservieren". Dies weist den Speicher zu, ändert jedoch nicht die "Größe" des Vektors.

+0

Obwohl richtig, erklären Sie nicht warum, was wichtiger ist. –

Verwandte Themen