C++ const public field 与 getter 方法

2024-01-12

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

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

private:
    static long next_id = 0;
}

然而,一个缺陷是,id字段是公共的,可以由调用者更改,从而违反了其唯一性。传统的(嗯,至少在我看来)是idprivate,并使用 getter 函数来访问它,因此:

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

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

但我正在考虑采用不同的方法。我可以将 id 设置为 const 公共类字段:

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

private:
    static long next_id = 0;
}

我更喜欢这种方式,因为我不必一直打电话getId()每次我需要 id 时,我都可以使用 id 作为映射中的键(因为复制构造正确地初始化了复制对象的 id)。我能想到的一个缺点是我无法在fooWithUniqueId对象,尽管目前我不需要这个功能。

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

谢谢,波阿斯


我可以使用 id 作为映射中的键(因为复制构造正确地初始化了复制对象的 id)

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

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

我强烈建议您坚持最佳实践并使用具有 getter 函数的私有字段。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ const public field 与 getter 方法 的相关文章

  • Task.Factory.StartNew 或 Parallel.ForEach 对于许多长时间运行的任务? [复制]

    这个问题在这里已经有答案了 可能的重复 Parallel ForEach 与 Task Factory StartNew https stackoverflow com questions 5009181 parallel foreach
  • 如何向WebRequest添加参数?

    我需要从 Web 服务调用一个方法 所以我编写了以下代码 private string urlPath http xxx xxx xxx manager string request urlPath index php org get or
  • 显示 div 内的用户名列表

    我是 jQuery 新手 在我的项目中 我创建了一个类User其中代码如下所示 static ConcurrentDictionary
  • C++0x 初始值设定项列表示例

    我想看看这个现有代码示例如何利用 C 0x 初始化列表功能 示例0 include
  • 在异步请求中使用超时回调

    我之前问过这个问题 但我将用提出的解决方案来完成这个问题 并提出另一个问题 我正在使用这个类来进行异步网络请求 http msdn microsoft com en us library system net webrequest aspx
  • 静态 OpenCV 库中未定义的引用

    我有一个使用 OpenCV 3 1 的 C 项目 并且使用共享库可以正常工作 但现在我想使用静态库 位于项目目录中的文件夹中 来编译它 因为我希望能够在未安装 OpenCV 的情况下导出它 如果需要还可以编辑和重新编译 这次我重新编译了 O
  • 如何将 Visual-Studio 2010 切换到 c++11

    我是 c 编程新手 我想尝试 c 11 新功能 那么我要问的是如何切换 Visual studio 2010 才能编译 c 11 源代码 你可以参考这个表 VC10 中的 C 0x 核心语言功能 表格 http blogs msdn com
  • C# 实体框架我们应该使用 POCO.Id 还是仅使用 POCO 设置关系?

    我在服务方法中遇到一种情况 将 POCO 分配为另一个 POCO 的子对象无法按预期工作 我正在使用实体框架 4 public void ChangeOrderCurrency Currency currency order Currenc
  • 为什么我在 WinForms 列表框中得到“System.Data.DataRowView”而不是实际值?

    每当我运行代码并尝试查看highscore我在列表框中得到的只是System Data DataRowView 谁能明白为什么吗 Code MySqlConnection myConn new MySqlConnection connStr
  • AcceptSocket 超时?

    是否有可能AcceptSocket on a TcpListener具有超时的对象 以便它偶尔被中断 TcpListener server new TcpListener localIP port server Start while sh
  • PartialView Action 正在调用自身

    我有 MVC 应用程序 它用于从主视图 ProductMaster 将 ProductAreaGrid 列表显示为 PartialView 并且它将在局部视图内将 CreateProductArea 作为 PartialView 我的 Gr
  • 多线程 - 比单线程慢

    当我使用多个线程而不是单线程运行程序时 它会变慢 不是应该更快吗 该程序应该遍历从起始目录开始的所有目录 并查找并打印所有名为 X 的文件 代码如下 while done pthread mutex lock lock if list is
  • 根据 Active Directory 策略检查密码[重复]

    这个问题在这里已经有答案了 我有一个允许用户更改其 AD 密码的前端 有没有办法获取特定用户及其属性 长度 复杂性 的密码策略 例如细粒度 有没有办法根据此特定策略检查字符串 xyz121 编辑 我不想检查活动目录中存储的当前密码 我想检查
  • 为什么 rand() 总是返回相同的值? [复制]

    这个问题在这里已经有答案了 可能的重复 在C中生成随机数 https stackoverflow com questions 3067364 generating random numbers in c 使用 rand 生成随机数 http
  • 何时分离或加入 boost 线程?

    我有一个方法 大约每 30 秒触发一次 我需要在一个线程中包含它 我有一个可以从类外调用的方法 像 call Threaded Method 这样的东西会创建一个线程 该线程本身会调用最终的线程方法 这些是 MyClass 的方法 void
  • 禁用实体框架的默认值生成(Code First)

    我数据库中有一个列不能为空 我想将其设置为默认值在数据库中 问题是实体框架似乎自己创建了一个默认值 例如 int gt 0 并且完全忽略了数据库中的默认值约束 有没有办法禁用实体框架的默认值 我发现您可以使用以下属性来装饰您的字段 Data
  • 在 Windows 上使用 C/C++ 开发时省略 msvcr100.dll?

    是否可以在 Windows 上使用 C C 进行开发而不链接到 msvcr100 dll 我知道这是 Windows 的标准 c 库 但我想知道如果我没有安装 Visual Studio 或 Redistributable 软件包 我的计算
  • 使用 WinAPI 连接禁用的显示设备

    我的问题是启用禁用的监视器ChangeDisplaySettingsEx 我想这不是火箭科学 但经过一番挖掘后 它看起来仍然是不可能的 我找到了一种根据找到的 Microsoft 代码示例禁用所有辅助显示器的方法here https msd
  • 如何创建实体集或模型而不在数据库中创建相应的表 - 实体框架

    我的 sqlserver 数据库中有一个存储过程 它返回多个结果集 我正在使用 msdn 中的以下链接从实体框架中的 SP 读取多个结果集 https msdn microsoft com en us library jj691402 v
  • 查找和替换正则表达式问题

    感谢这里对我其他问题的所有大力帮助 我开始掌握正则表达式 但我仍然对这个一无所知 我的代码是 StreamReader reader new StreamReader fDialog FileName ToString string con

随机推荐

  • Maven 编译器插件

    我知道默认的 Maven 编译器插件绑定到 compile 测试编译 生命周期 一般在不指定附加配置的情况下 我们不必 在我们的 POM 中明确定义它 但我仍然看到经验丰富的开发人员将诸如 这在他们的 POM 中 例如
  • 如何禁用主干历史记录但仍允许基于哈希的路由?

    假设我执行以下操作 单击主页 上的链接并转到 posts 1 触发事件并前往主干路由 posts 1 1 edit 我点击返回 我需要这样做 以便用户最终回到主页 而不是回到 posts 1 所以我需要允许骨干哈希路由工作但不修改历史记录
  • gcc 抑制警告“太小,无法容纳所有值”

    我需要使用范围枚举 以便我可以将它们作为特定类型传递给我们的序列化程序 我已经为枚举成员给出了明确的整数值Enum1 我已将与上面的描述相匹配的两个作用域枚举放入位字段中 enum class Enum1 value1 0x0 value2
  • Recyclerview 按字母顺序滚动条

    我需要实现一个类似于三星音乐应用程序的recyclerview字母滚动条 由于信誉低 我无法发布图像 我已阅读有关此的所有帖子 但我不想要气泡卷轴 我将所有字母表都放在垂直 LinearLayout 中 我想知道如何滚动到特定项目 你可以用
  • 如何在 JavaScript 中使用 x,y 坐标模拟点击?

    是否可以使用给定的坐标来模拟网页中 JavaScript 的点击 您可以派遣一个click事件 尽管这与真正的点击不同 例如 它不能用于欺骗跨域 iframe 文档 使其认为它已被单击 所有现代浏览器都支持document elementF
  • 在Python中按索引从列表中删除元素的简洁方法

    我有一个字符列表和索引列表 myList a b c d toRemove 0 2 我想通过一次操作得到这个 myList b d 我可以做到这一点 但有没有办法做得更快 toRemove reverse for i in toRemove
  • Java FileWriter 和 BufferedWriter 的区别

    它们之间有什么区别 我刚刚学习 Java ATM 但似乎我可以两种方式写入文件 我没有在这里复制 try catch 块 FileWriter file new FileWriter foo txt file write foobar fi
  • 张量流:在多个检查点运行模型评估

    在我当前的项目中 我训练一个模型并每 100 个迭代步骤保存检查点 检查点文件全部保存到同一目录 model ckpt 100 model ckpt 200 model ckpt 300 等 之后 我想根据所有已保存检查点 而不仅仅是最新检
  • WPF 数据网格样式

    有谁知道 有如何将 WPF DataGrid 布局更改为卡片视图或其他任何东西的示例 而不仅仅是行堆栈 结果看起来像这样 替代文本 http iwebthereforeiam com files ScreenShot gif http iw
  • 如何保证训练阶段不会出现OOM?

    标题中的问题已经完成 如何保证训练阶段不会出现OOM 只是一些旁注 根据我的经验 有两种 OOM 情况 一种是模型和小批量所需的内存大于您拥有的内存 在这种情况下 训练阶段将永远不会开始 解决这个问题的解决方案是使用较小的批量大小 尽管如果
  • 使用 Argonaut 进行 Scalaz 验证

    我有一个案例类和伴随对象 case class Person private name String age Int object Person def validAge age Int if age gt 18 age successNe
  • 我们如何在 Android 中播放/缓冲几分钟的视频?

    我需要播放视频的前 2 分钟 使用 onBufferingUpdate 我得到缓冲的百分比 但当 onPrepared 被调用时 我的缓冲百分比为 40 这是一个超过 2 分钟的视频 考虑到我有一个30分钟的视频 有什么办法可以让我只播放
  • PIL / urllib2 - 使用 StringIO 传递文件时无法识别图像文件

    我正在使用 urllib2 从网络下载图像 一旦我下载了它 我想使用一个名为 PIL 的图像模块来用它做一些事情 我不想将文件保存到磁盘然后重新打开 而是使用从内存中传递它StringIO from PIL import Image ima
  • 当 ng-grid 通过 ng-hide 将可见性从不可见更改为可见时,不会重新计算网格宽度

    我有一个带有 ng hide 属性和 width 100 样式的 ng grid div class grid style style display inline block height 300px width 100 div 该网格第
  • Xcode 6 自动完成失败(<<错误类型>>)

    我正在使用 Swift 开发一个应用程序 并且在某个时候我开始遇到奇怪的 Xcode 行为 我不完全记得它是如何发生的 但自动完成功能拒绝工作 并且对于我的所有变量 类型是 gt 我尝试了这里提供的一些解决方案 但它们都不起作用 这种令人沮
  • 如何从pyspark中的数组中提取元素

    我有一个具有以下类型的数据框 col1 col2 col3 col4 xxxx yyyy zzzz 1111 2222 我希望我的输出是以下类型 col1 col2 col3 col4 col5 xxxx yyyy zzzz 1111 22
  • 在每年的每个月下划线 js 组

    这是我的输入 json data id 3 created by 1 created at 2022 01 31T07 00 01 880Z id 2 created by 1 created at 2022 01 31T07 00 01
  • IE 抛出访问被拒绝错误

    我有 2 个项目 相互连接和通信 在 2 个 tomcat 实例上运行 在我的本地 我有 2 个 tomcats 正在运行 在所有不同的浏览器上一切都很好 除了 IE 之外 它说访问被拒绝加载 Javascript 文件 所以我已经包含了一
  • Erlang 列表理解

    我正在测试一个具有两个不等式的表达式来满足列表理解的条件 有没有办法在这里进行赋值而不重复该表达式 下面的代码不起作用 但我希望它能起作用 diagnose Expertise PatientSymptoms gt CertainDisea
  • C++ const public field 与 getter 方法

    我想为某个类的每个对象添加唯一的 ID 在单个会话内 一种解决方案是使用工厂函数来增加一些静态计数器 一个更简单的解决方案是将此计数器添加到类本身 例如 class fooWithUniqueId public fooWithUniqueI