2014-10-08 87 views
0

我需要开发一种快速算法,问题的自然结构是C++算法结构和类

class A {B b; C c;}; 
class B {}; 
class C {}; 

与B类和C采用A级领域的一些方法,但我想,由于范围原因,这是不可能的。 我怎样才能更好地构造这个?也许在B和C中包含一个类A指针?

+3

如果将类A置于B和C之下,那么您将拥有的工作良好,因此编译器在看到它们在A中使用时具有B和C的定义。 – 2014-10-08 12:10:16

+0

应在'A之前定义'B'和'C' ',那么你可以在两个定义之后定义你的方法。您可能需要做一些前瞻性声明。 – Jarod42 2014-10-08 12:11:01

+3

如果你在C++中键入'class',而不是'Class' ... – quantdev 2014-10-08 12:11:08

回答

1

一个天真的(简单的)解决方案是简单的引用传递给A来构造两个BC

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的真正目的是什么?仅仅是成为BC的持有者吗?它有工作吗?它试图做太多吗?

或者,也许问题是在相反的方向。也许是为了将每一件东西都挤在一个对象形状的盒子里,你已经创建了一台比它需要更复杂的机器。应该B的和C的任务真的是A的责任?或者甚至是(无喘气)的免费功能?

+0

某些A类方法要求存储在类B和C中的值以及其他未存储在此处的值。这就是为什么我想将其他值存储在另一个类(A)中的原因。由于我的代码中有很多模板,因此我想避免根据大量模板定义函数,并认为这是最简单的方法......感谢您的回答 – user1403546 2014-10-08 13:04:57

+0

也许这些值应该放在另一个“ class'(或'struct'),'D',其中'A','B'和'C'分别获得/引用的副本? – 2014-10-08 13:36:36

3

在B和C中不包括指向A的指针,但在需要A元素的方法的参数列表中包含指针(虽然不是很好的解决方案)。

但是,如果B和C的实例是 A的实例的状态组成部分,也是需要 A的实例的其他地方,那么你应该考虑移动从B和C的方法添加到原因:如果方法对b,c和其他部分进行操作,那么很可能它是a的行为。

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中包含a.h,从而避免了头文件中的循环依赖。