由彼此组成的课程

时间:2014-02-22 16:58:01

标签: c++ oop inheritance composition

考虑这个代码示例:

class Base
{
public:
    Base() {}      
};

class Derived1 : public Base
{
public:
    Derived1() : Base() {}
};

class Derived2 : public Base
{
public:
    Derived2() : Base() {}

};

有没有让Derived1 有一个 Derived2而Derived2 有一个 Derived1? 最好的解决方案是使用具有这两个对象的第三类。但是,如果需要高性能?

示例可能是双向客户端 - 服务器应用程序。

编辑:请注意,这只是一个摘要示例。在实际代码中,三个类中的每一个都可能抛出异常;但我确保代码是异常安全的。

2 个答案:

答案 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;
}

http://ideone.com/RVU8AR

这样两个类可以相互通信。注意私有指针和初始化到构造函数中。使用“朋友”声明,一个类可以修改其他类的私有成员。

答案 1 :(得分:0)

每个类都可以保存一个指针:?

class Derived1
    Derived2 *p_d2;
class Derived2
    Derived1 *p_d1;