gpt4 book ai didi

C++ const public 字段与 getter 方法

转载 作者:可可西里 更新时间:2023-11-01 18:27:39 25 4
gpt4 key购买 nike

我想为某个类的每个对象添加唯一 ID(在单个 session 中)。一种解决方案是使用增加一些静态计数器的工厂函数。一个更简单的解决方案是将这个计数器添加到类本身,例如:

class fooWithUniqueId {
public:
fooWithUniqueId() : id(next_id++) {...};
long id;

private:
static long next_id = 0;
}

然而,一个缺陷是 id 字段是公共(public)的,并且可以由调用者更改,因此违反了它的唯一性。传统的(好吧,至少在我看来)是将 id 设为私有(private),并使用 getter 函数来访问它,因此:

class fooWithUniqueId {
public:
fooWithUniqueId() : id(next_id++) {...};
long getId() const { return id; };

private:
long id;
static long next_id = 0;
}

但我正在考虑一种不同的方法。我可以将 id 设为 const 公共(public)类字段:

class fooWithUniqueId {
public:
fooWithUniqueId() : id(next_id++) {...};
const long id;

private:
static long next_id = 0;
}

我更喜欢这种方式,因为我不必每次需要 id 时都调用 getId(),我可以将 id 用作映射中的键(作为正确的复制构造初始化复制对象的 id)。我能想到的一个缺点是我无法实现 fooWithUniqueId 对象之间的分配,尽管目前我不需要此功能。

  • 每种方法(getter 函数/const 字段)的优缺点是什么?
  • 假设我使用的是“const”方法,有没有什么方法可以在不破坏代码的情况下稍后实现赋值运算符?

谢谢,波阿斯

最佳答案

I can use the id as a key in a map (as copy construction correctly initializes the id of the copy object)

“正确”是什么意思?默认复制构造函数将复制 ID,无论它是存储在私有(private)成员变量还是公共(public)成员变量中,最终您将得到两个共享相同 ID 的对象。这可能不是您想要的。

一般来说,您不应该在 C++ 中使用公共(public)变量,因为它违反了适当的封装。始终使用 (inline) getter 方法。唯一的缺点是您必须多输入几个字符。

我强烈建议您坚持最佳做法并使用具有 getter 函数的私有(private)字段。

关于C++ const public 字段与 getter 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4984375/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com