c ++类的设计:在其他类成员中常用类成员;小界面与小班级

时间:2016-11-30 09:18:19

标签: c++ oop class-design

假设我有一个带有一些成员属性的A类。 A还有一个带有B类对象的向量(std::vector<B>)。那些B对象需要一些(比如说是5)A的属性。我看到两种处理方式:

1)让B引用这些属性,并在B&#39的构造函数中赋值。

2)让B只引用A对象,并通过公共getAttributeXYZ()函数获取属性。

我可以看到解决方案1)在技术上对A的了解较少,因此它更好,因为它无法调用一些错误的A函数。但我觉得2)更清洁,因为构造函数更小,而B类本身具有更少(引用)属性。是否有一般的更好的方法,还是取决于细节?

上下文:在我的程序中,A的成员是纹理管理,文本绘图等可以被所有B对象共享的类。

1 个答案:

答案 0 :(得分:3)

在这种情况下,您可以通过B只访问A的相关子集来获取您的蛋糕并将其吃掉。你可以通过多种方式解决这个问题。

一,在专门的课堂上收集属性:

struct A
{
  struct SharedData
  {
    int data;
    // ...
  };

  A();

private:
  SharedData sharedData;
  std::vector<B> bs;
  // other data here
};

struct B
{
  B(A::SharedData *data) : data{data} {}

private:
  A::SharedData *data;
};

A::A() : bs{B{&sharedData}} {}

二,给A一个专用接口来访问这些属性:

struct SharedDataInterface
{
  virtual int getData() const = 0;
};

struct A : SharedDataInterface
{
  int getData() override { return sharedData; }

  A();

private:
  std::vector<B> bs;
  int sharedData;
  // other data here
};

struct B
{
  B(SharedDataInterface *data) : data{data} {}

private:
  SharedDataInterface *data;
};

A::A() : bs{B{this}} {}

我确信此主题的其他变体也是可能的。