【问题标题】:Best OO design implementation in C++?C++ 中最好的 OO 设计实现?
【发布时间】:2013-04-24 09:07:43
【问题描述】:

这可能更多的是关于味道。

类似这样的:

class A:public vector<int>{};

class B:public vector<A>{
};

class C{
public:
vector<B> cs;
};

现在我要实现的是A 中的一个函数,它接收C 的对象。像这样的:

class A:vector<int>{
void foo( C &c);
};

这是不可能的,因为 C 需要 BB 需要完全声明 A。然后我看到 2 个选项:

1) 将 foo 设为:void foo(void *c); 并在实现上(在 A.cpp 中)进行强制转换。这个问题不是很好,也不是很干净,对其他开发人员来说有点混乱。

2) 在我正在处理的命名空间上创建一个对象。这违反了 SOLID 原则,尤其是单一责任原则。

也许还有第三种我看不到的方式,它没有不方便。任何人都可以告诉我是否有更正确的剂量形式?

【问题讨论】:

  • 一个普通的旧前向声明怎么样?
  • 首先,在 C++03 中,至少在 C 中有一个 vector&lt;C&gt; 是未定义的行为。其次,您可以在A 上方声明class C;,让您使用foo 的声明定义A。你应该把foo的定义放在C的类之后。
  • 不要从std::vector继承。它没有虚拟析构函数(这可能是也可能不是问题),但只要让它成为成员肯定会改善您的设计。
  • 感谢我以前从未在课堂上使用过。
  • 抱歉,C 上的向量 是复制过去错误

标签: c++ oop


【解决方案1】:

使用前向声明:

class C;

【讨论】:

    【解决方案2】:

    我不确定我是否看到了您的问题。没有问题:

    class C;
    class A
    {
        void foo( C& c );
    };
    

    (但是你的C 有问题。一个类C 不能 包含std::vector&lt;C&gt;,因为std::vector 要求 实例化类型是完整的,C 只是完整的 在右大括号之后。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多