我应该如何共享数据结构

时间:2012-11-10 22:33:32

标签: c++ oop

  

Bjarne Stroustrup:我的经验法则是你应该有一个真实的   当且仅当你有一个接口和隐藏表示的类   可以考虑为班级设定一个不变量。

在当前项目中,我有一个名为Widget的基类。它有x,y,width,height(基本上是一个rect数据结构)的私有变量,以及每个变量的公共getter和setter。除了是一个愚蠢的变量持有者之外,他们对这个阶级没有任何意根据Bjarnes上面的评论,我摆脱了这个类,但我想知道如何与需要它们的子类共享这个数据结构。我应该单独将它们作为每个班级的成员包括在内吗?把它们放在一个Widget命名空间里?

3 个答案:

答案 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)。这意味着,(逻辑)类的工作对用户是不可见的,并且类对象通过成员函数和自由函数进行通信。在数据抽象方面,有时被解释为“不要从外部访问成员变量”,但这只是核心思想的浅层措辞。

您仍然应该像对待(或CommanderDietmar Kühl建议的那样)对异构数据集合使用结构化设计。您是否使用classstruct关键字是个人品味,但我倾向于使用struct关键字,因此很明显此类型不是逻辑意义上的一个类,但只是一些属于一起的数据。我发现使用正确的结构比std::tuple更可取,因为你可以命名所有成员,赋予它们意义,而不是通过索引访问它们并且必须记住每个索引应该是什么意思。此外,将来更容易修改和扩展struct