【问题标题】:Classes composed by each others彼此组成的类
【发布时间】:2014-02-22 16:58:00
【问题描述】:

考虑这个代码示例:

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

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

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

};

有没有什么可以使 Derived1 has-a Derived2 和 Derived2 has-a Derived1?
最好的解决方案是使用具有这两个对象的第三类。但万一需要高性能呢?

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

编辑:认为这只是一个摘要示例。在实际代码中,这三个类中的每一个都可能引发异常;不过,我确保代码是异常安全的。

【问题讨论】:

  • 请更具体地说明您要完成的工作。
  • 为什么第四个对象会降低性能?
  • @BrianBi,我认为他希望这两个类要么相互继承,要么包含另一个类?
  • 在第一篇中补充:够了吗?
  • @EdHeal 你是不是漏掉了一个否定句?

标签: c++ oop inheritance composition


【解决方案1】:

您可以通过forward declaration 完成“has-a”关系,它基本上告诉“此类存在,只是尚未声明”

#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

这样两个类就可以相互通信了。注意私有指针和构造函数的初始化。通过“朋友”声明,一个类可以修改另一个类的私有成员。

【讨论】:

  • 不知道是用指针还是第三类。因为我必须制作 2 个Derived1 和 2 个Derived2(一个用于客户端应用程序,另一个用于服务器)。不能在构造函数中初始化ptrs 以使它们成为private
  • 当然可以。尽管在获取其指针之前需要存在一个元素。一些技巧也可以解决这个问题,或者您可以释放模板的力量并在编译时做所有事情。还要记住,指针是轻量级元素,而不是另一个类。
  • 另外:看看新代码。我也使用了朋友课程
  • 这是一个好点。我正在考虑,因为使用第三类会更安全(因为我会自己制作对象,而不是依赖用户的输入);不过,性能可能会变得更糟。我会继续思考,我应该很快就能得到答案。
  • 老实说没什么大不了的,如果你只保留指针,即使使用第三类,性能开销也可以忽略不计。当您拥有使用指针或移动语义 (C++11) 的大对象时,几乎是必须的。
【解决方案2】:

每个类都可以持有一个指针:?

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 2020-05-17
    • 1970-01-01
    • 2016-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多