假设我有一个名为myList
的容器类。此容器类有一个名为capacity
的私有成员变量,用于保存实例中的值数。
对于类的用户而言,访问capacity
可能是有益的,例如,知道他们何时到达循环中的每个值时到达终点。因此,capacity
应该是公开的。
但是,这也会允许班级用户修改capacity
,这显然会搞砸。
myList myInstance;
myInstance.capacity = 123;
拥有一个只返回capacity
的值的公共成员函数,这将是一个私有变量,这被认为是不好的做法吗?例如:
unsigned int getCapacity()
{
return capacity;
}
当capacity
的值发生变化时,“克隆”变量会更新为capacity
的值吗?该类的用户将访问公共“克隆”而不是私有变量本身。
答案 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指针而不是其地址,您就可以了。