假设我有一个带有一些成员属性的A类。 A还有一个带有B类对象的向量(std::vector<B>
)。那些B对象需要一些(比如说是5)A的属性。我看到两种处理方式:
1)让B引用这些属性,并在B&#39的构造函数中赋值。
2)让B只引用A对象,并通过公共getAttributeXYZ()
函数获取属性。
我可以看到解决方案1)在技术上对A的了解较少,因此它更好,因为它无法调用一些错误的A函数。但我觉得2)更清洁,因为构造函数更小,而B类本身具有更少(引用)属性。是否有一般的更好的方法,还是取决于细节?
上下文:在我的程序中,A的成员是纹理管理,文本绘图等可以被所有B对象共享的类。
答案 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}} {}
我确信此主题的其他变体也是可能的。