Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c+的设计+;类:类成员在其他类成员中的常用;小型接口与小型类_C++_Oop_Class Design - Fatal编程技术网

C++ c+的设计+;类:类成员在其他类成员中的常用;小型接口与小型类

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类本身的(引用)属性也要少得多。有没有更好的方法,还是取决于细节

假设我有一个具有一些成员属性的类a。A还有一个带有B类对象的向量(
std::vector
)。这些B对象需要A的一些属性(比如5个)。我看到两种处理方法:

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

2) 让B只引用a对象,并通过public
getAttributeXYZ()
函数获取属性


我可以看出,解决方案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之间的依赖性就会减少。我还认为,试图最小化逻辑上依赖的两个事物之间的依赖性是愚蠢的做法。使用最清晰的设计,即使它不是理论上最纯粹的。“有没有更好的方法,还是取决于细节?”:不知道细节我们怎么知道?:)这就是为什么一个好的问题应该形成一个,而不是一个一般性的问题