【发布时间】: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 需要 B 和 B 需要完全声明 A。然后我看到 2 个选项:
1) 将 foo 设为:void foo(void *c); 并在实现上(在 A.cpp 中)进行强制转换。这个问题不是很好,也不是很干净,对其他开发人员来说有点混乱。
2) 在我正在处理的命名空间上创建一个对象。这违反了 SOLID 原则,尤其是单一责任原则。
也许还有第三种我看不到的方式,它没有不方便。任何人都可以告诉我是否有更正确的剂量形式?
【问题讨论】:
-
一个普通的旧前向声明怎么样?
-
首先,在 C++03 中,至少在
C中有一个vector<C>是未定义的行为。其次,您可以在A上方声明class C;,让您使用foo的声明定义A。你应该把foo的定义放在C的类之后。 -
不要从
std::vector继承。它没有虚拟析构函数(这可能是也可能不是问题),但只要让它成为成员肯定会改善您的设计。 -
感谢我以前从未在课堂上使用过。
-
抱歉,C 上的向量
是复制过去错误