这的确是好表/最佳实践的问题。 我使用C ++结构,形成被设计为基本保存数据,而不是使一类一吨的访问方法是什么也不做,但获取/设置值的对象。 例如:
struct Person {
std::string name;
DateObject dob;
(...)
};
如果你想像20多个变量存在,写这与私有成员和40多岁的访问器一类是管理一个痛苦,似乎浪费了我。
虽然有时,我可能还需要某种最低限度的功能添加到数据。 在这个例子中,说我有时也需要年龄的基础上,出生日期:
struct Person {
std::string name;
DateObject dob;
(...)
int age() {return calculated age from dob;}
}
当然,对于任何复杂的功能,我会做一个类,但对于这样的只是一个简单的功能,这是“糟糕的设计”? 如果我使用一个类,它是坏的形式来保持数据变量作为公共类的成员,或者我只需要接受它,并让班和一帮存取方法? 我理解类和结构之间的区别,我只是问的最佳做法。
我认为有两个重要的设计原则,这里要考虑:
隐藏类的表示通过一个接口,如果有这个类的一些不变的。
一类有一个不变的时候有作为该类无效状态这样的事情。 类应在任何时候都保持其不变。
考虑一个Point
,它表示一个二维几何点类型。 这应该只是一个struct
与公共x
和y
数据成员。 这里是一个无效的点没有这样的事情。 的每个组合x
和y
值是完全正常的。
在的情况下Person
,是否有不变量完全取决于手头的问题。 你认为这样的事情作为一个空的名字作为一个有效的名称? 在可Person
有出生的任何日期? 对于你的情况,我想答案是肯定的,你的类应该保持成员公开。
参见: 类应该强制执行不变
非朋友非成员函数提高封装。
没有理由你的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;
}
在C ++中,结构是一种类, 唯一的区别(我至少可以想到的)在于在结构中的成员默认为公用,但在课堂上,他们是私有的。 这意味着它是完全可以接受的结构体的使用,你是- 这篇文章解释得很好。
在C ++中,结构和类之间的唯一区别是结构是公众可见默认。 一个很好的准则是使用结构如普通老式数据(POD),只有持有当需要更多的功能(成员函数)进行数据和使用类。
您可能仍然想知道是否只是有公共变量在类或使用成员函数; 请考虑以下情形。
比方说,你有一个类, A
具有功能GetSomeVariable
这仅仅是一个私有变量一个getter:
class A
{
double _someVariable;
public:
double GetSomeVariable() { return _someVariable; }
};
如果,二十年下来的线,该变量变化的意义,你必须这样做,比方说,0.5乘呢? 当使用吸气剂,它是简单的; 刚刚返回变量乘以0.5:
double GetSomeVariable() { return 0.5*_someVariable; }
通过这样做,你允许易维护,并允许方便地修改。
如果您想进行一些数据的持有人则喜欢结构没有任何get / set方法。
如果有更多的东西,因为在这种情况下,“人”。
- 它的模型现实世界中的实体,
- 具有一定的状态和行为,
- 与外部世界的互动,
- 表现出与其他实体的简单/复杂的关系,
- 它可能演变加班,
那么它是一类一个完美的候选人。
“仅用于传输数据的被动对象使用结构;一切是一类。”
说谷歌guidlines ,我做这种方式,并发现这是一个很好的规则。 除此之外,我认为你可以定义自己的语用学,或者从这一规则的偏差,如果真的很有意义。
文章来源: C++ Structs with Member Functions vs. Classes with Public Variables