c++ - c++类: common use of class members in other class members; Small interface vs small classes的设计

标签 c++ oop class-design

<分区>

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

1) 让 B 拥有对这些属性的引用,并在 B 的构造函数中分配它们。

2)让B只拥有A对象的引用,通过public getAttributeXYZ()获取属性功能。

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

上下文:在我的程序中,A 的那些成员是用于纹理管理、文本绘制等的类,可以由所有 B 对象共享。

最佳答案

在这种情况下,您可以让 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一个专用接口(interface)来访问这些属性:

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}} {}

我确信关于这个主题的其他变体也是可能的。

关于c++ - c++类: common use of class members in other class members; Small interface vs small classes的设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40884380/

相关文章:

c++ - OpenGL glOrtho 设置匹配窗口大小

objective-c - cocoa 中的单例,他们是邪恶的吗?

c# - 模型类的复合属性是否应该始终初始化?

language-agnostic - 对象的行为回答什么问题?

java - 什么对创建对象的时间影响最大​​?

c# - 防止在设计时调整高度

c++ - getline(cin,_string);

c++ - 为什么将 std::endl 与 ostringstream 一起使用会影响输出速度?

c++ - 为Raspbian jessie交叉编译qt5.5

php - 在 PHP 中的类方法中使用命名空间