Das Problem ist, dass du die Klasse B lediglich (forward)
deklariert hast. Der Compiler weiß, dass es sie gibt, aber nicht wie sie aussieht, von daher kennt er auch nicht die Funktion, die später in der Klasse aufgeführt wird. Das kann mit einem Interface (was es in C++ leider (noch) nicht so reinrassig gibt, der Punkt geht an Java =/ ) aufgelöst werden. Dazu kann man in C++ die abstrakten Klassen verwenden, etwa so:
Code:
//interface.h
class A;
class B
class IA
{
public:
//virtual ... = 0 heißt indem Fall reinvirtuell und bedeutet, dass wir keine Instanz dieser Klasse anlegen können,
//sondern eben nur von ihr erben dürfen. Interface halt^^
virtual void atest(void) = 0;
};
class IB
{
public:
virtual void btest(void) = 0;
};
Jez weiß der Compiler, es gibt zwei abstrakte Klassen (interfaces), die A und B heißen und jeweils ihre Funktionen haben. Und jez implementierst du das Interface:
Code:
//iwo anders
#include "CB.h"
class CA : public IA
{
private:
//da wir die Klasse IB deklariert UND definiert haben, kennt der Compiler die Klasse bestens und somit auch ihre
//funktionen!
IB* myB;
public:
void atest(void)
{
myB = new CB;
myB->btest();
}
};
//analog dazu CB
Und nun in der main:
Code:
//main.cpp
#include "CA.h"
int main(void)
{
IA* temp = new CA;
CA->atest();
return(0);
}
Sas kannst du in dem Fall tun, da du von einem Zeiger immer in den Geerbten Zeiger umwandlen kannst. Es würde auch gehen CA* temp = new CA; Damit würdest du aber an anderer Stelle Probleme bekommen. Natürlich bleibt zu erwähnen, dass das Konzept nur Vorteile hat, und das in der großen Softwareerzeugung bis dato unersetzbar ist :>
mfg heck
_________________
Irrlicht - From Noob To Pro A Guideline
--
Sonstige Projekte, Blog :
http://www.rpdev.net