Ich versuche, eine abstrakte Klasse zu verwenden, wenn ein erweitertes Objekt als Parameter an eine Funktion übergeben wird, aber meine bisherigen Versuche haben zu einigen Compiler-Fehlern geführt.
Ich habe einige Hinweise darauf, was das Problem ist, ich bin offensichtlich nicht erlaubt, eine abstrakte Klasse zu instanziieren, und ich glaube, einige der Code in MyClass versucht, dies zu tun, auch wenn dies nicht meine Absicht ist. In einigen Untersuchungen wurde vorgeschlagen, dass ich das Objekt als Zeiger referenzieren sollte, um das zu erreichen, was ich will, aber meine bisherigen Versuche sind gescheitert, und ich bin nicht einmal sicher, dass dies die Antwort ist (daher meine Frage hier).
Ich gebe zu, dass ich mit Java besser vertraut bin als mit C++, und ich bin sicher, dass ein Teil meines Problems darauf zurückzuführen ist.
Hier ist ein Beispiel dafür, was ich in meinem Programm zu tun versuche:
class A {
public:
virtual void action() = 0;
};
class B : public A {
public:
B() {}
void action() {
// Do stuff
}
};
class MyClass {
public:
void setInstance(A newInstance) {
instance = newInstance;
}
void doSomething() {
instance.action();
}
private:
A instance;
};
int main(int argc, char** argv) {
MyClass c;
B myInstance;
c.setInstance(myInstance);
c.doSomething();
return 0;
}
Dieses Beispiel erzeugt denselben Compilerfehler, den ich in meinem Programm erhalte:
sean@SEAN-PC:~/Desktop$ gcc -o test test.cpp
test.cpp:20: error: cannot declare parameter ‘newInstance’ to be of abstract type ‘A’
test.cpp:2: note: because the following virtual functions are pure within ‘A’:
test.cpp:4: note: virtual void A::action()
test.cpp:30: error: cannot declare field ‘MyClass::instance’ to be of abstract type ‘A’
test.cpp:2: note: since type ‘A’ has pure virtual functions
test.cpp: In function ‘int main(int, char**)’:
test.cpp:36: error: cannot allocate an object of abstract type ‘A’
test.cpp:2: note: since type ‘A’ has pure virtual functions
Update
Vielen Dank für das Feedback.
Ich habe seitdem "MyClass::instance geändert, um einen Zeiger des Typs A enthalten, aber ich bekomme jetzt einige bizarre Fehler im Zusammenhang mit der vtable:
sean@SEAN-PC:~/Desktop$ gcc -o test test.cpp
/tmp/ccoEdRxq.o:(.rodata._ZTI1B[typeinfo for B]+0x0): undefined reference to `vtable for __cxxabiv1::__si_class_type_info'
/tmp/ccoEdRxq.o:(.rodata._ZTI1A[typeinfo for A]+0x0): undefined reference to `vtable for __cxxabiv1::__class_type_info'
/tmp/ccoEdRxq.o:(.rodata._ZTV1A[vtable for A]+0x8): undefined reference to `__cxa_pure_virtual'
collect2: ld returned 1 exit status
Mein geänderter Code lautet wie folgt (A und B wurden nicht geändert):
class MyClass {
public:
void setInstance(A* newInstance) {
instance = newInstance;
}
void doSomething() {
instance->action();
}
private:
A* instance;
};
int main(int argc, char** argv) {
MyClass c;
B myInstance;
c.setInstance(&myInstance);
c.doSomething();
return 0;
}