C++ c+的设计+;类:类成员在其他类成员中的常用;小型接口与小型类
假设我有一个具有一些成员属性的类a。A还有一个带有B类对象的向量(C++ c+的设计+;类:类成员在其他类成员中的常用;小型接口与小型类,c++,oop,class-design,C++,Oop,Class Design,假设我有一个具有一些成员属性的类a。A还有一个带有B类对象的向量(std::vector)。这些B对象需要A的一些属性(比如5个)。我看到两种处理方法: 1) 让B引用这些属性,并在B的构造函数中分配它们 2) 让B只引用a对象,并通过publicgetAttributeXYZ()函数获取属性 我可以看出,解决方案1)在技术上对A的了解较少,因此它更好,因为它不能调用某个错误的A函数。但我觉得2)要干净得多,因为构造函数要小得多,B类本身的(引用)属性也要少得多。有没有更好的方法,还是取决于细节
std::vector
)。这些B对象需要A的一些属性(比如5个)。我看到两种处理方法:
1) 让B引用这些属性,并在B的构造函数中分配它们
2) 让B只引用a对象,并通过publicgetAttributeXYZ()
函数获取属性
我可以看出,解决方案1)在技术上对A的了解较少,因此它更好,因为它不能调用某个错误的A函数。但我觉得2)要干净得多,因为构造函数要小得多,B类本身的(引用)属性也要少得多。有没有更好的方法,还是取决于细节
上下文:在我的程序中,A的那些成员是纹理管理、文本绘制等的类,可以被所有B对象共享。在这种情况下,您可以吃蛋糕,只允许
B
s访问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}} {}
我相信这个话题也可能有其他的变化。在这种情况下,您也可以吃蛋糕,只允许
B
s访问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}} {}
我相信这个主题也可能有其他的变化。我不遵循#1对A了解得更少的逻辑。如果它直接引用属性,它仍然依赖于A。事实上,它更依赖于A的私有实现细节,然而,如果只存储对a的引用并调用公共访问器函数,那么a和B之间的依赖性就会减少。我还认为,试图最小化逻辑上依赖的两个事物之间的依赖性是愚蠢的做法。使用最清晰的设计,即使它不是理论上最纯粹的。“有没有更好的方法,还是取决于细节?”:不知道细节我们怎么知道?:)这就是为什么一个好的问题应该被格式化为一个问题,而不是一个一般的问题。我不遵循#1对a了解得更少的逻辑。如果它直接引用属性,它仍然同样依赖于a。事实上,它更依赖于a的私有实现细节,然而,如果只存储对a的引用并调用公共访问器函数,那么a和B之间的依赖性就会减少。我还认为,试图最小化逻辑上依赖的两个事物之间的依赖性是愚蠢的做法。使用最清晰的设计,即使它不是理论上最纯粹的。“有没有更好的方法,还是取决于细节?”:不知道细节我们怎么知道?:)这就是为什么一个好的问题应该形成一个,而不是一个一般性的问题