Hier zuzugreifen, ist eine abstrakte Klasse, die ich schrieb:Wie ein Datenelement eines Vektors voller abgeleiteten Klassen
class Month
{
public:
//factory method
static Month* choose_month(int choice); //static function
virtual void birthstone() = 0; //virtual function
virtual void month() = 0; //virtual function
virtual ~Month()
{
std::cout << "Deleting the virtual destructor" << std::endl;
};
};
Month* Month::choose_month(int choice)
{
switch (choice)
{
case '1':
return new January;
break;
case '2':
return new February;
break;
//these cases go all the way to December
default:
break;
}
}
Dann Klassen Ich schaffe zwölf abgeleitet, eine für jeden Monat des Jahres. Ich werde nur zwei der Klassen der Einfachheit halber sind:
class January : public Month
{
public:
void birthstone()
{
std::cout << "Garnet" << std::endl;
}
void month()
{
std::cout << "January" << std::endl;
}
//destructor
~January()
{
std::cout << "Deleting the object" << std::endl;
}
};
class February : public Month
{
public:
void birthstone()
{
std::cout << "Amethyst" << std::endl;
}
void month()
{
std::cout << "February" << std::endl;
}
//destructor
~February()
{
std::cout << "Deleting the object" << std::endl;
}
};
In meiner Hauptfunktion ich einen Zufallszahlengenerator auf die Auswahl einer abgeleiteten Klasse zu verwenden, so dass ich die Daten in ihren Mitgliedsfunktionen zugreifen können:
std::vector<Month*> stone;
std::srand(static_cast<unsigned>(time(0))); // Seed the random generator
//for-loop
for (int i = 0; i < 6; i++)
{
stone.push_back(Month::choose_month(random(12)));
}
Das Problem tritt auf, wenn ich versuche, auf eine Mitgliedsfunktion einer Klasse zuzugreifen, die in meinem Vektor gespeichert ist. Ich halte eine Zugriffsverletzung Fehler bekommen:
//displaying the elements inside the container
for (std::vector<Month*>::iterator iter = stone.begin(); iter != stone.end(); iter++)
{
(*iter)->birthstone();
}
Ich kann nicht wirklich sehen, wo der Fehler ist, und frage mich, ob jemand bitte darauf hinweisen könnte, was falsch gehen? Vielen Dank.
Ihre 'choice_month'-Funktion hat ein undefiniertes Verhalten, da sie nicht-void-Rückgabetyp hat und keine' return'-Anweisung für jeden Pfad hat. –
Sie haben triviale Fehler, die vom Compiler abgefangen werden, wenn Sie die Warnstufe hochdrehen. – juanchopanza
Sie schalten Zeichen, nicht ganze Zahlen um. – tkausl