声明 C++ 不可变类的惯用方式

2024-03-31

所以我有一些相当广泛的功能代码,其中主要数据类型是不可变的结构/类。我声明不变性的方式是通过将成员变量和任何方法设置为 const 来“实际上是不可变的”。

struct RockSolid {
   const float x;
   const float y;
   float MakeHarderConcrete() const { return x + y; }
}

这实际上是 C++ 中“我们应该这样做”的方式吗?或者,还有更好的方法?


您提出的方法非常好,除非在您的代码中您需要对 RockSolid 变量进行赋值,如下所示:

RockSolid a(0,1);
RockSolid b(0,1);
a = b;

这不起作用,因为复制赋值运算符会被编译器删除。

因此,另一种方法是将结构重写为具有私有数据成员和仅公共 const 函数的类。

class RockSolid {
  private:
    float x;
    float y;

  public:
    RockSolid(float _x, float _y) : x(_x), y(_y) {
    }
    float MakeHarderConcrete() const { return x + y; }
    float getX() const { return x; }
    float getY() const { return y; }
 }

通过这种方式,您的 RockSolid 对象是(伪)不可变的,但您仍然可以进行分配。

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

声明 C++ 不可变类的惯用方式 的相关文章

  • 如果.Net Core可以在Windows上运行,为什么不能在.Net Framework中引用.Net Core DLL?

    我明白为什么 Net Framework 可能会在 Net Core IE 中导致问题 因为不存在特定于 Windows 平台的 API 但是为什么不能直接引用 Net Core 作为 Net Framework 中的库呢 如果 Net C
  • 使用实体框架从集合中删除项目

    我正在使用DDD 我有一个 Product 类 它是一个聚合根 public class Product IAggregateRoot public virtual ICollection
  • 有什么工具可以说明每种方法运行需要多长时间?

    我的程序的某些部分速度很慢 我想知道是否有我可以使用的工具 例如它可以告诉我可以运行 methodA 花了 100ms 等等 或者类似的有用信息 如果您使用的是 Visual Studio Team System 性能工具 中有一个内置分析
  • Linux TUN/TAP:无法从 TAP 设备读回数据

    问题是关于如何正确配置想要使用 Tun Tap 模块的 Linux 主机 My Goal 利用现有的路由软件 以下为APP1和APP2 但拦截并修改其发送和接收的所有消息 由Mediator完成 我的场景 Ubuntu 10 04 Mach
  • ASP .NET MVC,创建类似路由配置的永久链接

    我需要帮助在 MVC 网站中创建类似 URL 路由的永久链接 Slug 已设置为 www xyz com profile slug 代码为 routes MapRoute name Profile url profile slug defa
  • 在管道中重用变量的功能方式

    在 javascript 和 typescript 中与 Ramda 一起使用函数式编程 我经常发现自己编写如下代码 const myFun c gt const myId c id const value pipe getAnotherO
  • 如何在 VS 中键入时显示方法的完整文档?

    标题非常具有描述性 是否有任何扩展可以让我看到我正在输入的方法的完整文档 我想查看文档 因为我可以在对象浏览器中看到它 其中包含参数的描述和所有内容 而不仅仅是一些 摘要 当然可以选择查看所有覆盖 它可能是智能感知的一部分 或者我不知道它并
  • 如何用 kevent() 替换 select() 以获得更高的性能?

    来自Kqueue 维基百科页面 http en wikipedia org wiki Kqueue Kqueue 在内核和用户空间之间提供高效的输入和输出事件管道 因此 可以修改事件过滤器以及接收待处理事件 同时每次主事件循环迭代仅使用对
  • 转到 C# WPF 中的第一页

    我正在 WPF 中使用导航服务 为了导航到页面 我使用 this NavigationService Navigate new MyPage 为了返回我使用 this NavigationService GoBack 但是如何在不使用的情况
  • 为什么 std::allocator 在 C++17 中丢失成员类型/函数?

    一边看着std 分配器 http en cppreference com w cpp memory allocator 我看到成员 value type pointer const pointer reference const refer
  • Xamarin Android:获取内存中的所有进程

    有没有办法读取所有进程 而不仅仅是正在运行的进程 如果我对 Android 的理解正确的话 一次只有一个进程在运行 其他所有进程都被冻结 后台进程被忽略 您可以使用以下代码片段获取当前正在运行的所有 Android 应用程序进程 Activ
  • 为什么 FTPWebRequest 或 WebRequest 通常不接受 /../ 路径?

    我正在尝试从 ftp Web 服务器自动执行一些上传 下载任务 当我通过客户端甚至通过 Firefox 连接到服务器时 为了访问我的目录 我必须指定如下路径 ftp ftpserver com AB00000 incoming files
  • 通过不同 DLL 或 EXE 中的指针或引用访问 STL 对象时发生访问冲突

    我在使用旧版 VC6 时遇到以下问题 我只是无法切换到现代编译器 因为我正在处理遗留代码库 http support microsoft com kb 172396 http support microsoft com kb 172396
  • C# 搜索目录中包含字符串的所有文件,然后返回该字符串

    使用用户在文本框中输入的内容 我想搜索目录中的哪个文件包含该文本 然后我想解析出信息 但我似乎找不到该字符串或至少返回信息 任何帮助将不胜感激 我当前的代码 private void btnSearchSerial Click object
  • Silverlight Datagrid:在对列进行排序时突出显示整个列

    我的 Silverlight 应用程序中有一个 DataGrid 我想在对该列进行排序时突出显示整个列 它在概念上与上一个问题类似 Silverlight DataGrid 突出显示整列 https stackoverflow com qu
  • 32位PPC rlwinm指令

    我在理解上有点困难rlwinmPPC 汇编指令 旋转左字立即然后与掩码 我正在尝试反转函数的这一部分 rlwinm r3 r3 0 28 28 我已经知道什么了r3 is r3在本例中是一个 4 字节整数 但我不确定这条指令到底是什么rlw
  • 如何在 GCC 5 中处理双 ABI?

    我尝试了解如何克服 GCC 5 中引入的双重 ABI 的问题 但是 我没能做到 这是一个重现错误的非常简单的示例 我使用的GCC版本是5 2 如您所见 我的主要函数 在 main cpp 文件中 非常简单 main cpp include
  • 热重载时调用方法

    我正在使用 Visual Studio 2022 和 C 制作游戏 我想知道当您热重新加载应用程序 当它正在运行时 时是否可以触发一些代码 我基本上有 2 个名为 UnloadLevel 和 LoadLevel 的方法 我想在热重载时执行它
  • Swagger 为 ASP.CORE 3 中的字典生成错误的 URL

    当从查询字符串中提取的模型将字典作为其属性之一时 Swagger 会生成不正确的 URL 如何告诉 Swagger 更改 URL 中字典的格式或手动定义输入参数模式而不自动生成 尝试使用 Swashbuckle 和 NSwag 控制器 pu
  • Azure函数版本2.0-应用程序blobTrigger不工作

    我有一个工作功能应用程序 它有一个 blob 输入和一个事件中心输出 在测试版中工作 随着最新的更改 我的功能不再起作用 我尝试根据发行说明更新 host json 文件 但它没有引用 blob 触发器 version 2 0 extens

随机推荐

  • 如何检测 Node.js 中函数的所有依赖项?

    我试图对我的问题有一个大致的了解 我需要使用 Node js 编写一个程序 该程序应该能够检测函数的所有依赖项 E g function a do something b function b console log Hey This is
  • 使用 msmtp 通过终端发送邮件工作正常,但不适用于 php mail()

    最近我在运行 kubuntu 桌面的 ubuntu 12 04 服务器上安装了 msmtp msmtp 的安装工作正常 我什至可以使用 gmail 的 smtp 服务器通过终端发送邮件 我的问题是 虽然可以通过终端发送邮件 但它仍然无法使用
  • 如何从文本文件中获取特定行并在android中显示数组列表

    我有一个文本文件 我能够读取完整内容并将其显示在视图上 文本文件的示例格式 userdetail William Bits 6th cross road City house Rio lt 051 22345690 gt lt 002 22
  • 如何清除 dropzone.js dropzone

    我开始使用 dropzone js 并遇到了一个小问题 我能够上传文件 我使用模式弹出窗口来获取文件信息 问题是当我返回时 我之前上传的文件仍然在放置区域中 带有复选标记 我想要一个空的拖放区 Ideas 我看到的所有答案都涉及在初始化 d
  • xlwings Book.save() 错误:Workbook 类的 SaveAs 方法失败

    我正在打开一个 Excel 文件wb使用 xlwings 进行一些操作 然后尝试将其保存到目录中 问题是正常的 xw Book save 偶尔会引发错误 对于我继续使用此代码来说 至关重要的是我可以相信它不会抛出错误 下面的代码给我以下错误
  • Android 工作管理器:“无法实例化 Worker”

    我已经按照Android 开发者的 https developer android com topic libraries architecture workmanager basics workflow有关使用工作线程管理器结构在后台运行
  • 应用商店的演示视频? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我将我的应用程序上传到 itunes connect 我等了几天 然后我上传的应用程序被拒绝 原因之一是我没有使用我的应用程序的演示视频
  • JavaScript: 假 ||未定义与未定义 ||错误的

    行为的解释是什么运算符 逻辑或 当与false and undefinedJavaScript 中的两边 1 gt false undefined undefined 2 gt undefined false false 逻辑性OR运算符不
  • 有没有办法访问私有 plsql 过程以进行测试?

    我正在开发一个包含大量 plsql 代码的项目 并希望向我们的代码库添加更具体的单元测试 我喜欢测试的一些过程 函数不在包规范中 我无法更改它 有没有办法访问这些 私有 plsql 过程而不将它们添加到规范中 到目前为止 我唯一的想法是在测
  • 如何在 ColdFusion 中用空/零字节填充字符串以及 MacOS 和 Windows 上的 CF 之间的差异

    我无法理解如何用空字节填充 CF 中的字符串 在Java中我会这样做 String ZeroPad for int i 0 i lt 32 i ZeroPad ZeroPad 0 String strKey strUsername strP
  • 使用 Unity 和 MVVM 在 WPF 中保留用户凭据

    尽管我在 Windows 应用程序中做了类似的事情 但我在这方面的表现却很糟糕 我正在开发 WPF 应用程序 Prism Unity MVVM 并且刚刚完成登录视图 一旦根据 SQL Server 中的表验证了用户的凭据 我将执行以下操作
  • 如何将数据从选项卡栏控制器传递到其选项卡之一?

    我在故事板中设置了一个 UITabBarController 我想从选项卡栏控制器传递数据字典以在适当的子选项卡中使用 这是一个标准的 UIViewController 这似乎是一个很长的问题要回答 但我真的不知道从哪里开始 我正在寻找最简
  • 如果 cellForRowAtIndexPath 未调用,如何更改 UITableViewCell 外观

    我的应用程序中有一个表格视图 表视图单元格具有带有图案图像的背景 表格视图内容正在发生变化 有时只有两三个单元格包含内容信息 表格视图会自动将其他单元格添加到屏幕底部 问题是这些单元格的背景很清晰 但我想让背景与其他单元格相同 带有图案图像
  • 使用可选参数来实现向后兼容性是一个好主意吗?

    我想知道如何通过使用可选参数来提供向后兼容性 在我的程序中 我有一个带有函数的接口 该函数在整个程序以及许多单元测试中使用 对于某些新功能 必须将布尔值传递到此函数中 如果设置为 则会改变其行为false 如果你通过true 您将得到与以前
  • R - 将数据帧转换为时间序列[重复]

    这个问题在这里已经有答案了 我有谷歌股票数据 它有两列 日期 每日数据 和 收盘价 即 Google 收盘指数 Date Close 10 11 2013 871 99 10 10 2013 868 24 10 9 2013 855 86
  • 仅使用 .wt 文件恢复 MongoDB

    我的电脑崩溃了 我可以使用 wt 文件取回我的数据吗 旧 MongoDB 中的 wt 文件 您可以恢复您的 wt从 Atlas Backup 作为恢复文件夹解压或解压 下载的 WiredTiger 文件到本地 MongoDB 首先 备份您的
  • 如何为 LinearLayout 制作渐变背景?

    我想知道 在java 而不是xml 中为LinearLayout制作渐变背景的最佳方法是什么 有任何想法吗 Thanks
  • 从类内重定向到操作的正确方法?

    背景 我有一个项目分为 Webform 和 MVC 谢天谢地 正在转向 MVC 我有一个LoginManager包含一个类IRedirectionManager类 并根据用户属性 已通过身份验证 密码过期 尚未接受条款 调用重定向管理器上的
  • 在javascript中将字符串分割成句子

    目前我正在开发一个将长列分成短列的应用程序 为此 我将整个文本拆分为单词 但目前我的正则表达式也拆分了数字 我所做的是这样的 str This is a long string with some numbers 125 000 55 an
  • 声明 C++ 不可变类的惯用方式

    所以我有一些相当广泛的功能代码 其中主要数据类型是不可变的结构 类 我声明不变性的方式是通过将成员变量和任何方法设置为 const 来 实际上是不可变的 struct RockSolid const float x const float