我有三节课。 A,B和C.
B类是一个抽象类。
A类需要调用B类函数。
C类派生自B类,还需要持有指向A类的指针来调用A类函数。
需要指向B的指针。我知道这可以通过“B是一个抽象类来实现,它不可能创建它的实例。因此我在A中创建一个C实例并用它来调用B的函数“但是在创建C的实例时遇到问题。
C类需要一个指向A类的指针来调用它的函数。我如何实现这一目标?
//A.h
class A
{
public:
void fun1();
void fun2();
private:
// creating ptr to C because B is an abstract class
C *m_ptrC;
};
//A.cpp
void A::fun1()
{
m_ptrC->fun4();
}
void A::fun2()
{
//some code
}
//B.h
class B
{
public:
//pure virtual function
void fun3() = 0;
void fun4();
};
//B.cpp
void B::fun4()
{
//pure virtual hence C::fun3() gets called
fun3();
}
//C.h
class C:public B
{
public:
//Overridden from B
void fun3();
private:
//Ptr to class A, to call fun
A *ptrA;
};
//C.cpp
//Overridden from B
void C::fun3()
{
ptrA->fun2();
}
ptrC和ptrA应该如何初始化? 此外,我不确定前向声明和文件包含重定义/不完整类型错误的结果。
答案 0 :(得分:1)
如果没有显示问题的实际代码,我认为这就是:
1 :你在A.h和C.h中包括C.h。这称为循环依赖。要避免这些,您需要使用前向声明。你基本上声明了这个类,并且只在cpp文件中包含它的标题实际使用它。所以在A.h例如你可以:
class C;
class A
{
void fun1();
private:
C *ptrC = new C;
};
然后在A.cpp中你可以包括C.h。
可能缺少其他问题,包括标题中的警卫。
2 :将A的实例(作为ref或指针)传递给C构造函数。此处也使用前向声明。对物体的使用寿命要谨慎。
具有这样的循环依赖性通常比值得更麻烦。尝试为A设置一个接口(这样你可以将它传递给C而不在C的翻译单元中包含A.h)或者使用绑定到A实例的仿函数。
3 :如果你没有使用多态,我真的不明白为什么你有一个C的接口,但可能是由于缺乏真正的代码。