c++ - 类和成员变量

标签 c++ class visibility private-members

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

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

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

myList myInstance;
myInstance.capacity = 123;

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

unsigned int getCapacity()
{
    return capacity;
}

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

最佳答案

有容量 setter/getter 。
但是将其标记为 const 成员:

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

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

虽然你应该考虑你类(class)的用户是否真的需要这些信息。
他们可以用它做什么?

所以你想在容量不够的时候预分配内存?

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.

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

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

关于c++ - 类和成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4626940/

相关文章:

c++ - 用于恢复先前值的 RAII 对象

swift - 如何将变量从 ViewController 类传递到其他结构?

c++ - 类析构函数中的堆损坏?

oop - 对字段和方法使用私有(private)而不是 protected 原因

JavaScript - control.style.display = "none";和 control.style.display = "";?

shared-libraries - mingw -fvisibility=hidden 似乎不起作用

c++ - LLVM 3.5中如何遍历支配树?

c++ - 如何使用没有复制构造函数的给定类初始化元组

c++ - CMake - 构建应用程序时遇到的 undefined symbol 取决于 PcapPlusPlus

c++ - 对象如何将自身添加到该对象的类中的 vector ?