类和成员变量

时间:2011-01-07 15:13:40

标签: c++ class visibility private-members

假设我有一个名为myList的容器类。此容器类有一个名为capacity的私有成员变量,用于保存实例中的值数。

对于类的用户而言,访问capacity可能是有益的,例如,知道他们何时到达循环中的每个值时到达终点。因此,capacity应该是公开的。

但是,这也会允许班级用户修改capacity,这显然会搞砸。

myList myInstance;
myInstance.capacity = 123;

拥有一个只返回capacity的值的公共成员函数,这将是一个私有变量,这被认为是不好的做法吗?例如:

unsigned int getCapacity()
{
    return capacity;
}

capacity的值发生变化时,“克隆”变量会更新为capacity的值吗?该类的用户将访问公共“克隆”而不是私有变量本身。

7 个答案:

答案 0 :(得分:4)

有容量吸气剂 但请将其标记为const成员:

unsigned int getCapacity()  const
{                        //^^^^^^^ 
    return capacity;
}

第二种解决方案不起作用 由于它不可靠(一个用户可能会更新它,然后下一个用户在阅读时会得到无效值)。

虽然你应该考虑你班级的用户是否真的知道这些信息 他们可以用它做什么?

如果容量不够,你想预先分配记忆吗?

MyList   x;
// I am going to add 10 items make sure there is enough room.
if (x.size() + 10 < x.capacity())
{    x.resize(x.size() + 10);
}

在这种情况下,只需重新调整大小。然后让你的容器什么都不做,如果它有空间。

x.resize(x.size() + 10);  // If the container has enough space do nothing. 
                          // Otherwise make sure there is enough room for 10 more items.

对象通常更好地管理它的自身,而不是提供对其内部状态的访问以允许其他对象间接地管理它。即使您将实现从实际变量中解耦,您仍然将自己耦合到具有容量的接口,并且它实际上并没有为您提供有意义的好处。

因此,方法应该(通常)是对对象执行操作的动作(动词)。这些操作操纵对象的状态。让动作成为对象的接口。请注意,一旦定义了对象的接口,就会很难改变该接口(删除功能)。

答案 1 :(得分:2)

访问者是一个很好的解决方案。这是STL选择的那个。请参阅std :: vector :: capacity(),std :: vector :: size(),...

答案 2 :(得分:2)

您描述的第一个解决方案被称为吸气剂,拥有这些解决方案被视为良好做法。

第二种解决方案实际上不是解决方案,它只是添加了第二个变量,并引入了更新它的必要性。

答案 3 :(得分:1)

不,这不是一个坏习惯。实际上,使用getter和setter被认为是最佳实践。

答案 4 :(得分:1)

根本不是一个糟糕的做法,这就是你实际需要做的事情。

答案 5 :(得分:0)

如果你有一个公共的getter,你可以只返回一个或容量的const引用。

这将允许客户看到但不能修改数据。

答案 6 :(得分:0)

只要您通过值返回private成员或通过非const指针返回const指针而不是其地址,您就可以了。