Bjarne Stroustrup:我的经验法则是你应该有一个真实的 当且仅当你有一个接口和隐藏表示的类 可以考虑为班级设定一个不变量。
在当前项目中,我有一个名为Widget的基类。它有x,y,width,height(基本上是一个rect数据结构)的私有变量,以及每个变量的公共getter和setter。除了是一个愚蠢的变量持有者之外,他们对这个阶级没有任何意根据Bjarnes上面的评论,我摆脱了这个类,但我想知道如何与需要它们的子类共享这个数据结构。我应该单独将它们作为每个班级的成员包括在内吗?把它们放在一个Widget命名空间里?
答案 0 :(得分:2)
您可以使用结构
e.g。
struct widget
{
int x;
int y;
int w;
int h;
};
答案 1 :(得分:1)
我不确定我是否完全同意Bjarne(除了不变量之外,更改表示的能力可能是一个重要的问题,尽管在这种情况下,甚至可能将实际定义移到PImpl而非而不仅仅是private
)。但是,如果不关心已更改的成员和/或不变量,则可以将变量分组到对其成员具有public
访问权限的结构中。如果成员确实只是在没有语义含义的情况下混在一起,你甚至可以只使用std::tuple
:
typedef std::tuple<int, int, double, double> widget;
...虽然在这种情况下,不同的成员确实具有访问功能 - 出于技术原因,不依赖于不变量和向前兼容性。
答案 2 :(得分:0)
我认为你在那里大量误读了Stroustrup,让我强调一下我认为重要的部分:
我的经验法则是,当且仅当您可以考虑该类的不变量时,您应该拥有一个带有界面和隐藏表示的真实类 。< / p>
我认为他在这种情况下并没有谈论不使用关键字class
,而是指逻辑类(或“真正的类” )。差异非常显着。类(注意缺少markdown)是一个带有自包含接口的数据结构,可能还有一个隐藏的实现(参见pimpl idiom)。这意味着,(逻辑)类的工作对用户是不可见的,并且类对象通过成员函数和自由函数进行通信。在数据抽象方面,有时被解释为“不要从外部访问成员变量”,但这只是核心思想的浅层措辞。
您仍然应该像对待(或Commander或Dietmar Kühl建议的那样)对异构数据集合使用结构化设计。您是否使用class
或struct
关键字是个人品味,但我倾向于使用struct
关键字,因此很明显此类型不是逻辑意义上的一个类,但只是一些属于一起的数据。我发现使用正确的结构比std::tuple
更可取,因为你可以命名所有成员,赋予它们意义,而不是通过索引访问它们并且必须记住每个索引应该是什么意思。此外,将来更容易修改和扩展struct
。