C++算法的结构和类

C++ algorithm structure and classes

本文关键字:结构 算法 C++      更新时间:2023-10-16

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

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的行为。

一个简单(直接)的解决方案是简单地将对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的持有者吗?它有工作吗?它是不是想做得太多了?

或者问题可能朝着相反的方向发展。也许为了把每一件东西都挤到一个物体形状的盒子里,你创造了一台比它需要的更复杂的机器。BC的任务真的应该由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,从而避免头文件中的循环依赖。