我需要开发一种快速算法,问题的自然结构将是
class A {B b; C c;};
class B {};
class C {};
使用A类字段的B类和C类的一些方法。但我认为,由于范围原因,这是不可能的。 我怎样才能更好地构建它?也许在B和C中包含一个A类指针?
答案 0 :(得分:3)
不包括指向B和C内部的A的指针,但是在需要A元素的方法的参数列表中包含指针(尽管不是那么好的解决方案)。
但是如果B和C的实例是的一部分 A的实例的状态,并且需要 A的实例的其他部分,那么你应该考虑一下将方法从B和C移动到A.原因:如果方法在b,c和a的其他部分上运行,则可能是a的行为。
答案 1 :(得分:1)
一个天真(直接)的解决方案是简单地将A
的引用传递给B
和C
的构造函数:
class B
{
public:
B (const A& a) : mA (a) {}
private:
const A& mA;
};
或者更好的是,将引用传递给您实际需要的字段:
class B
{
public:
B (const int& foo, const std::string& bar) : mFoo (foo), mBar (bar) {};
private:
const int& mFoo;
const std::string mBar;
};
但事实上,手头的问题让我想到了这种愚蠢的直接解决方案,这就是代码味道。我怀疑整个设计都被打破了。
我想知道A
的真正目的是什么?只是成为B
和C
的持有者?它有工作吗?它试图做太多吗?
或者问题可能是相反的方向。也许是为了试图将每一件东西都挤进一个物体形状的盒子里,你创造了一台比它需要的更复杂的机器。 B
和C
的任务真的应该由A
负责吗?或者甚至(喘息)自由功能?
答案 2 :(得分:0)
您可能需要使用接口,即B和C的抽象基类,我们称之为IB和IC(接口为B和C)。
a.h包括ib.h和ic.h。
B和C提供的服务仅通过接口基类使用。
b.h和c.h包括a.h. (当然还有ib.h和ic.h)。
但是如果只有B和C的实现需要A,那么你可以在没有接口基类的情况下进行管理 - 只在b.cpp和c.cpp中包含ah,从而避免了头文件中的循环依赖。