指向抽象类的指针
Posted
技术标签:
【中文标题】指向抽象类的指针【英文标题】:Pointer to abstract class 【发布时间】:2014-01-30 18:35:06 【问题描述】:我有三门课。 A、B 和 C。
B 类是一个抽象类。
A类需要调用B类的函数
C类是从B类派生的,也需要持有指向A类的指针来调用A类的函数。
要求一:
A 需要指向 B 的指针。我知道这可以使用“B 作为抽象类,它不可能创建它的实例来实现。因此我在 A 中创建 C 的实例并使用它来调用 B 的函数. " 但是在创建 C 的实例时遇到问题。
要求 2:
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 应该如何初始化? 另外我不确定前向声明和文件包含导致重新定义/不完整类型错误。
【问题讨论】:
添加一些演示问题的代码。 从您的陈述中不清楚您有什么或没有什么。你有一个从 B 派生并实现功能的类吗? 我认为 OP 存在循环依赖问题。前向声明可能会有所帮助。 @Jarod42 这也是我的想法,我只是在等待发布我的答案;) 它们都在同一个文件中吗? 【参考方案1】:如果没有显示问题的实际代码,我认为会发生以下情况:
1:您在 A.h 中包含 C.h,在 A.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 接口,但这可能是因为缺少真正的代码。
【讨论】:
以上是关于指向抽象类的指针的主要内容,如果未能解决你的问题,请参考以下文章