考虑这个代码示例:
class Base
{
public:
Base() {}
};
class Derived1 : public Base
{
public:
Derived1() : Base() {}
};
class Derived2 : public Base
{
public:
Derived2() : Base() {}
};
有没有让Derived1 有一个 Derived2而Derived2 有一个 Derived1? 最好的解决方案是使用具有这两个对象的第三类。但是,如果需要高性能?
示例可能是双向客户端 - 服务器应用程序。
编辑:请注意,这只是一个摘要示例。在实际代码中,三个类中的每一个都可能抛出异常;但我确保代码是异常安全的。
答案 0 :(得分:3)
你可以与has-a建立一个“forward declaration”关系,它基本上告诉“这个类存在,它还没有被宣布”
#include <iostream>
using namespace std;
class Base
{
public:
Base() {}
};
// Forward declaration
class Derived1;
class Derived2 : public Base
{
friend class Derived1;
public:
Derived2() : Base() {}
private:
Derived1 *ptr;
};
class Derived1 : public Base
{
public:
Derived1(Derived2& obj) : Base(), ptr(&obj) {
obj.ptr = this;
}
private:
Derived2 *ptr;
};
int main() {
Derived2 obj2;
Derived1 obj1(obj2);
return 0;
}
这样两个类可以相互通信。注意私有指针和初始化到构造函数中。使用“朋友”声明,一个类可以修改其他类的私有成员。
答案 1 :(得分:0)
每个类都可以保存一个指针:?
class Derived1
Derived2 *p_d2;
class Derived2
Derived1 *p_d1;