0

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

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

但是,这也将允许该类的用户修改capacity,这显然会搞砸。

myList myInstance;
myInstance.capacity = 123;

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

unsigned int getCapacity()
{
    return capacity;
}

capacity每当值capacity更改时更新为值的“克隆”变量怎么样?该类的用户将访问公共“克隆”而不是私有变量本身。

4

7 回答 7

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.

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

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

于 2011-01-07T15:22:32.113 回答
2

访问器是一个很好的解决方案。这是 STL 选择的。见 std::vector::capacity(), std::vector::size(), ...

于 2011-01-07T15:17:01.813 回答
2

您描述的第一个解决方案被称为吸气剂,拥有这些被认为是一种好习惯。

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

于 2011-01-07T15:17:40.653 回答
1

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

于 2011-01-07T15:16:51.707 回答
1

这根本不是一个坏习惯,这就是你实际需要这样做的方式。

于 2011-01-07T15:17:23.227 回答
0

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

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

于 2011-01-07T15:17:42.013 回答
0

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

于 2011-01-07T15:18:39.600 回答