abtract???
-
Hey Leute, ich habe verschiedene db-job die unterschiedlich abgearbeitet werden müssen und mir soetwas erstellt:
zb:
class dbjob {
public:
virtual string getState();
virtual short getWhatJob();
...
}class dbjobstate : public dbjob {
public:
string getState();
short getWhatJob();int getGroup();
}Im Hauptprogramm gibt es eine queue die die jobs nacheinander abarbeitet.
dort zeigt ein dbjob zeiger immer auf den jeweiligen job.dbjob *dbjobpointer;
if ( typeid (*dbjobpointer) == typeid (dbjobstate))
dbjobpointer->getGroup(); /// get nicht!!!!compiler output:
DBConnector.cpp:146: error: ‘pJob’ is not a member of ‘DBJobState’
make: *** [debug/DBConnector.o] Error 1Ist mit ja auch klar, aber kann ich die Funktion irgendwie ausführen??
was habe ich für möglichkeiten???mfg
dave
-
Wenn jede von dbjob abgeleitete Klasse eine Gruppe haben soll, kannst du diese Methode pur virtual in der Basisklasse definieren (
virtual int getGroup()=0;). Andernfalls mußt du den Pointer auf den richtigen Typ casten (dynamic_cast<> ist das sicherste), um dem Compiler klarzumachen, was für ein Objekt er wirklich hat (für den Compiler zeigt der Pointer immer noch auf ein 'dbjob'-Objekt - und das hat keine getGroup()-Methode).
-
klar kannst die ausführen die funktion, das ist erstmal recht einfach ABER wenn die funktion keine parameter übergeben bekommt und sich von alleine auf den aktuellen job beziehen soll dann frage ich dich woher soll sie das wissen denn, du leitest dbjob in dbjobstate ab aber bildest eine/ mehrere instanzen von dbjob das heisst dbjobstate hat 0 sinn. wenn du nat. class dbjob : public dbjobstate machst dann hast nat. die funktion im bezug zum aktuellen job. aber was weis ich halt keine ahnung wie der rest aussieht und ob das dein fehler ist oder gewollt. fehler kann ja auch sein dbjob *dbjobpointer, ich meine du hast dbjobestate die erbt von dbjob und dann machst die nichts damit?
Edit:
dynamic_cast<> geht auch halt nen bezug auf dbjobstate herstellen sonst ist sie doch nutzlos die klasse
-
Danke, die cast möglichkeit war mir nicht in den sinn gekommen. Finde es zwar nicht so sauber an dieser stelle (in meinen Projekt) aber egal - ist halt ne ausnahme - Dnake für eure schnelle antwort
-
Ja, der Cast ist etwas unsauber - aber manchmal geh es nicht anders (wobei es vermutlich die bessere Alternative wäre, die Methode in die Basisklasse zu übernehmen - aber das hängt auch davon ab, wieviele Kindklassen du definiert hast und wieviele davon ein getGroup() benötigen).
-
at cstoll:
zu viele (ca. 14 verschiede dbjob). ist halt ne ausnahme
kann es aber jetzt so auch vertretten. wo für ist der cast denn auch sonst da 