假设我有一个带有一些成员属性的类 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}} {}
我确信关于这个主题的其他变体也是可能的。