与成员函数对与公共变量类的C ++结构(C++ Structs with Member Functi

2019-07-22 16:46发布

这的确是好表/最佳实践的问题。 我使用C ++结构,形成被设计为基本保存数据,而不是使一类一吨的访问方法是什么也不做,但获取/设置值的对象。 例如:

struct Person {
    std::string name;
    DateObject dob;
    (...)
};

如果你想像20多个变量存在,写这与私有成员和40多岁的访问器一类是管理一个痛苦,似乎浪费了我。

虽然有时,我可能还需要某种最低限度的功能添加到数据。 在这个例子中,说我有时也需要年龄的基础上,出生日期:

struct Person {
    std::string name;
    DateObject dob;
    (...)
    int age() {return calculated age from dob;}
}

当然,对于任何复杂的功能,我会做一个类,但对于这样的只是一个简单的功能,这是“糟糕的设计”? 如果我使用一个类,它是坏的形式来保持数据变量作为公共类的成员,或者我只需要接受它,并让班和一帮存取方法? 我理解类和结构之间的区别,我只是问的最佳做法。

Answer 1:

我认为有两个重要的设计原则,这里要考虑:

  1. 隐藏类的表示通过一个接口,如果有这个类的一些不变的。

    一类有一个不变的时候有作为该类无效状态这样的事情。 类应在任何时候都保持其不变。

    考虑一个Point ,它表示一个二维几何点类型。 这应该只是一个struct与公共xy数据成员。 这里是一个无效的点没有这样的事情。 的每个组合xy值是完全正常的。

    在的情况下Person ,是否有不变量完全取决于手头的问题。 你认为这样的事情作为一个空的名字作为一个有效的名称? 在可Person有出生的任何日期? 对于你的情况,我想答案是肯定的,你的类应该保持成员公开。

    参见: 类应该强制执行不变

  2. 非朋友非成员函数提高封装。

    没有理由你的age功能应该被实现为成员函数。 结果age可以使用的公共接口来计算Person ,所以它没有理由的成员函数。 将其放置在相同的命名空间Person ,使其通过参数相关的查找找到。 通过ADL发现函数是类接口的一部分; 他们只是不能够访问私人数据。

    如果你没有使它成为一个成员函数,有一天出台了一些私人状态Person ,你将有一个不必要的依赖。 突然age有更多的数据访问比它需要。

    请参阅: 非成员函数如何提高封装

因此,这里是我将如何实现它:

struct Person {
  std::string name;
  DateObject dob;
};

int age(const Person& person) {
  return calculated age from person.dob;
}


Answer 2:

在C ++中,结构是一种类, 唯一的区别(我至少可以想到的)在于在结构中的成员默认为公用,但在课堂上,他们是私有的。 这意味着它是完全可以接受的结构体的使用,你是- 这篇文章解释得很好。



Answer 3:

在C ++中,结构和类之间的唯一区别是结构是公众可见默认。 一个很好的准则是使用结构如普通老式数据(POD),只有持有当需要更多的功能(成员函数)进行数据和使用类。

您可能仍然想知道是否只是有公共变量在类或使用成员函数; 请考虑以下情形。

比方说,你有一个类, A具有功能GetSomeVariable这仅仅是一个私有变量一个getter:

class A
{
    double _someVariable;

public:
    double GetSomeVariable() { return _someVariable; }
};

如果,二十年下来的线,该变量变化的意义,你必须这样做,比方说,0.5乘呢? 当使用吸气剂,它是简单的; 刚刚返回变量乘以0.5:

    double GetSomeVariable() { return 0.5*_someVariable; }

通过这样做,你允许易维护,并允许方便地修改。



Answer 4:

如果您想进行一些数据的持有人则喜欢结构没有任何get / set方法。

如果有更多的东西,因为在这种情况下,“人”。

  1. 它的模型现实世界中的实体,
  2. 具有一定的状态和行为,
  3. 与外部世界的互动,
  4. 表现出与其他实体的简单/复杂的关系,
  5. 它可能演变加班,

那么它是一类一个完美的候选人。



Answer 5:

“仅用于传输数据的被动对象使用结构;一切是一类。”

说谷歌guidlines ,我做这种方式,并发现这是一个很好的规则。 除此之外,我认为你可以定义自己的语用学,或者从这一规则的偏差,如果真的很有意义。



Answer 6:

我不想在这里闪耀圣战; 我通常区分它是这样的:

  • 对于POD对象(即,仅数据,而无需暴露行为)宣布内部公开和直接访问它们。 的使用struct关键字方便这里也作为对象使用的提示。
  • 对于非POD对象申报的内部私人和界定公共getter / setter方法。 用法class的关键字是在这种情况下更自然。


文章来源: C++ Structs with Member Functions vs. Classes with Public Variables
标签: c++ class struct