C++ C++;算法结构和类

C++ C++;算法结构和类,c++,algorithm,C++,Algorithm,我需要开发一个快速算法,问题的自然结构是 class A {B b; C c;}; class B {}; class C {}; 对于B类和C类的一些方法,使用A类的字段。但我认为由于范围的原因,这是不可能的。 我怎样才能更好地构建它?可能在B和C中包含一个类a指针?在B和C中不包含指向a的指针,但在需要a元素的方法的参数列表中包含指针(尽管不是很好的解决方案) 但是如果B和C的实例是A实例状态的部分,并且需要A实例的其他部分,那么您应该考虑将方法从B和C移动到A。原因:如果该方法在B、C和

我需要开发一个快速算法,问题的自然结构是

class A {B b; C c;};
class B {};
class C {};
对于B类和C类的一些方法,使用A类的字段。但我认为由于范围的原因,这是不可能的。
我怎样才能更好地构建它?可能在B和C中包含一个类a指针?

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


但是如果B和C的实例是A实例状态的部分,并且需要A实例的其他部分,那么您应该考虑将方法从B和C移动到A。原因:如果该方法在B、C和A的其他部分上运行,那么很可能,这是a的一种行为。

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


但是如果B和C的实例是A实例状态的部分,并且需要A实例的其他部分,那么您应该考虑将方法从B和C移动到A。原因:如果该方法在B、C和A的其他部分上运行,那么很可能,这是a的行为。

您可能需要使用接口,即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,从而避免头文件中的循环依赖。

您可能需要使用接口,即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,从而避免头文件中的循环依赖。

A朴素(直截了当)解决方案是将对
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
的真正目的到底是什么?它仅仅是a
B
和a
C
的持有者吗?它有工作吗?它是不是想做的太多了


或者问题的方向正好相反。也许为了把每一件东西都塞进一个物体形状的盒子里,你创造了一台比它需要的更复杂的机器。
B
C
的任务真的应该由
A
负责吗?或者甚至是(gasp)自由函数?

一个简单(直接)的解决方案是将对
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
的真正目的到底是什么?它仅仅是a
B
和a
C
的持有者吗?它有工作吗?它是不是想做的太多了


或者问题的方向正好相反。也许为了把每一件东西都塞进一个物体形状的盒子里,你创造了一台比它需要的更复杂的机器。
B
C
的任务真的应该由
A
负责吗?或者甚至是(gasp)自由函数?

如果将类A放在B和C下面,那么编译器在看到B和C在A中使用时会对它们进行定义,那么您所拥有的将很好工作。
B
C
应该在
A
之前定义,然后您可以在这两个定义之后定义您的方法。你可能不得不做一些前向声明。如果你输入了<代码>类< /COD>,而不是<代码>类< /C> >,C++中……我会认为自然顺序就像你说的那样。如果A依赖于B和C,那么在A之前声明它们似乎是很自然的。@Jarod42我想你的意思也是声明的。它们不必定义(至少在链接时间之前)。@luk32:由于OP使用对象而不是指针/引用,因此必须定义类。(因此,这些方法至少是声明的,可以/应该在以后定义)如果你把类A放在B和C下面,那么编译器在A中使用B和C时,会有一个B和C的定义,那么你所拥有的将很好工作。
B
C
应该在
A
之前定义,然后你可以在这两个定义之后定义你的方法。你可能不得不做一些前向声明。如果你输入了<代码>类< /COD>,而不是<代码>类< /C> >,C++中……我会认为自然顺序就像你说的那样。如果A依赖于B和C,那么在A之前声明它们似乎是很自然的。@Jarod42我想你的意思也是声明的。它们不必定义(至少在链接时间之前)。@luk32:由于OP使用对象而不是指针/引用,因此必须定义类。(因此这些方法至少是声明的,可以/应该在以后定义)有些A类方法需要存储在B类和C类中的值以及其他未存储在B类和C类中的值。这就是为什么我想在另一个c中存储其他值