Zugriffsverletzung Vektor Klasse
-
Hallo,
ich habe folgende Einstiegsklasse, die alles weitere aufruft:
#include "stdafx.h" #include "Rezeptbuch.h" #include "Misch_Rezeptbuch.h" class Control; class CocktailPro { private: Misch_Rezeptbuch* MyRezeptbuch; Control *control; public: CocktailPro(); ~CocktailPro(); void Menu(); }; CocktailPro::CocktailPro() { // das Rezeptbuch anlegen Misch_Rezeptbuch* MyRezeptbuch = new Misch_Rezeptbuch(); Menu(); } CocktailPro::~CocktailPro() { delete MyRezeptbuch; } void CocktailPro::Menu() { // Rezeptliste ausgeben cout << "*********************************************" << endl; MyRezeptbuch->ausgeben(); cout << "*********************************************" << endl; // Rezeptschritte abfragen MyRezeptbuch->rezeptschritte_ausgeben(); }Bei der Methode "ausgeben()" bekomme ich die Zugriffsverletzung.
DIe Klasse Misch_Rezeptbuch erbt von der Klasse Rezeptbuch.
Die Methode aussortieren, schmeißt die Coktails welche nicht hergestellt werden können aus dem Vektor. Wenn ich nun die MEthode "ausgeben()" im Konstuktor von Misch_Rezeptbuch aufrufe klappt es.
In die Klasse Rezeptbuch, habe ich keine Einsicht, da diese als *.obj gelinkt wird.Fehlermeldung: this 0xcdcdcdcd {vergleich=[...]() zutaten=[...]() } Misch_Rezeptbuch * const Rezeptbuch {m_Rezepte=[...](... } Rezeptbuch __vfptr CXX0030: Fehler: Ausdruck kann nicht ausgewertet werden#include "Rezeptbuch.h" class Misch_Rezeptbuch: public Rezeptbuch { private: vector<int> vergleich; vector<string> zutaten; public: Misch_Rezeptbuch(); void aussortieren(); void ausgeben(); void rezeptschritte_ausgeben(); void zutaten_einlesen(); void zutaten_ausgeben(); }; #include "Misch_Rezeptbuch.h" Misch_Rezeptbuch::Misch_Rezeptbuch() { zutaten_einlesen(); zutaten_ausgeben(); aussortieren(); } void Misch_Rezeptbuch::aussortieren() { cout << "*********************************************" << endl; for (int i=0; i<GetAnzahlRezepte(); i++) // f�r jedes Rezept... { Rezept* r = GetRezept(i); for (int j=0; j<r->GetAnzahlRezeptschritte(); j++) // f�r jeden Rezeptschritt... { bool state = false; Rezeptschritt* rs = r->GetRezeptSchritt(j); string Zutat = rs->getM_Zutat(); for (size_t k=0;k<zutaten.size();k++) { //Zutat == steht im Rezept mit Mischen und Stampfen //zutaten[] == vector im Zutaten aus datei ohen Mischen und Stampfen. if (Zutat==zutaten[k] || Zutat=="Mischen" || Zutat=="Stampfen") { state = true; break; } } if(!state) //false { vergleich.push_back(i); cout << i << ". " <<r->getName() << " -> KANN NICHT HERGESTELLT WERDEN" <<endl; break; } } } for (size_t i=0;i<vergleich.size();i++) { Rezept* r = GetRezept(vergleich[i]-i); // -i ganz wichtig bool test = DeleteRezept(vergleich[i]-i); if (test) { cout << r->getName() << " -> Wird geloescht" << endl; } else { cout << r->getName() << " -> Konnte nicht geloescht werden"<<endl; } } } void Misch_Rezeptbuch::ausgeben() { cout << "Es gibt " << GetAnzahlRezepte() << " Cocktails" << endl; for (size_t i=0; i<GetAnzahlRezepte(); i++) { Rezept* r = GetRezept(i); cout << i << ". " << r->getName() << endl; } }
-
Ich tippe auf einen Nullpointer.
Kannst du das nicht mal debuggen und dir mal ausgeben lassen, was GetAnzahlRezepte zurückgibt, und ob wirklich so viele existieren?
Also ob r tatsächlich immer auf ein Rezept zeigt? eine r==NULL Abfrage wäre davor vielleicht sinnvoll.Das vfptr in der Fehlermeldung steht für "virtual function pointer". Also wird dein Zeiger vielleicht irgendwo ins Nirvana zeigen.
Ist nur eine Vermutung ^^.
Debug es einfach mal durch und sag uns bitte bescheid wo genau der Fehler kommt. Da können wir den vielleicht etwas eingrenzen.
-
Der Fehler kommt beim Aufruf der Methode "ausgeben()" in der Klasse CocktailPro.
Also "GetAnzahlRezepte()" liefert beim Aufruf der Methode"ausgeben()" über die Klasse CoktailPro eine Minus Zahl zurück.Wenn ich die Methode "ausgeben()" im Konstrucktor von Misch_Rezeptbuch aufrufe klappt es.
-
Krikus schrieb:
Wenn ich die Methode "ausgeben()" im Konstrucktor von Misch_Rezeptbuch aufrufe klappt es.
Dann schau dir mal an warum es funktioniert:
class CocktailPro { private: Misch_Rezeptbuch* MyRezeptbuch; public: CocktailPro(); }; CocktailPro::CocktailPro() { // das Rezeptbuch anlegen Misch_Rezeptbuch* MyRezeptbuch = new Misch_Rezeptbuch(); // <<=== Na was machst du da? Menu(); }Schau dir den Code an der von mir kommentierten Stelle GENAU (!) an und schau evtl. in deinem Buch nochmal im Kapitel "Sichtbarkeitsbereich von Objekten" nach.
-
Irgendwie hab ich nen Brett vorm Kopf.
Ich lege dort dynamisch einen neues Objekt im Heap an.
Wenn ich bei Sichtbarkeiten von Objekten schauen, dann bekomme ich public,private... zur Kapselung in dem Buch angeboten.
-
Misch_Rezeptbuch* MyRezeptbuch = new Misch_Rezeptbuch(); // <<=== Na was machst du da? //^^^^^^^^^^^^^^^^ }
-
Um es nochmal deutlicher zu machen:
Object* obj; { // neuer Scope = Sichtbarkeitsbereich // dieses obj ist ein neues Objekt! Es heißt nur so wie das äußere Object* obj = new Object; } // Dieses obj ist nicht initialisiert, das Programm wird mit einer Zugriffsverletzung beendet // (wenn in der Funktion auf Membervariablen zugegriffen wird) obj->crashApp();
-
l'abra d'or schrieb:
Um es nochmal deutlicher zu machen:
Object* obj; { // neuer Scope = Sichtbarkeitsbereich // dieses obj ist ein neues Objekt! Es heißt nur so wie das äußere Object* obj = new Object; } // Dieses obj ist nicht initialisiert, das Programm wird mit einer Zugriffsverletzung beendet // (wenn in der Funktion auf Membervariablen zugegriffen wird) obj->crashApp();Mhhh. Das leuchtet ein. Auch warum es an meinem Beispiel nicht funktioniert,
Hatte solch einen Fehler bis jetzt noch nicht, weiß daher auch nicht wie man so etwas umgeht. Im schlauen Buch steht auch nichts wirkliches brauchbares drin.
-
Krikus schrieb:
Mhhh. Das leuchtet ein. Auch warum es an meinem Beispiel nicht funktioniert,
Hatte solch einen Fehler bis jetzt noch nicht, weiß daher auch nicht wie man so etwas umgeht. Im schlauen Buch steht auch nichts wirkliches brauchbares drin.Indem du das Objekt initialisierst, mit dem du in deiner Klasse auch arbeiten kannst und willst

CocktailPro::CocktailPro() { MyRezeptbuch = new Misch_Rezeptbuch; Menu(); }Oder gleich mit Initialisierungsliste:
CocktailPro::CocktailPro() : MyRezeptbuch( new Misch_Rezeptbuch ); { Menu(); }