如何保持指针之间的 const 正确性?

2023-12-30

我试图对一个真正 const 的类进行 const 操作 - 它不会更改该类指向的数据。

例如:

class Node{
public:
    int val;
};
class V{
public:
    Node * node; //what is the change that is needed here?
    void const_action()const{
        node->val=5; //error wanted here
    }
    void action(){
        node->val=5; //error is not wanted here
    }
};

您可以使用模板来强制指针的 const 正确性,而无需更改类的含义或实现:

    template <typename T>
class PreseveConstPointer
{
    T *t_;
public:
    PreseveConstPointer(T *t = nullptr)
        : t_(t)
    {
    }
    PreseveConstPointer<T> * operator=(T *t)
    {
        t_ = t;
        return this;
    }
    T* operator->()
    {
        return t_;
    }
    T const * operator->() const
    {
        return t_;
    }
    T * data()
    {
        return t_;
    }
};
class Node{
public:
    int val;
};
class V{
public:
    PreseveConstPointer<Node> node;
    V()
    {
        node = new Node;
    }
    ~V()
    {
        if(node.data())
            delete node.data();
    }
    void const_action()const{
        node->val=5; // You will get an error here
    }
    void action(){
        node->val=5; // No error here
    }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何保持指针之间的 const 正确性? 的相关文章

  • boost::asio + std::future - 关闭套接字后访问冲突

    我正在编写一个简单的 TCP 客户端来发送和接收单行文本 异步操作由 std future 处理 以便于超时阻塞查询 不幸的是 我的测试应用程序在破坏服务器对象时因访问冲突而崩溃 这是我的代码 TCP客户端 hpp ifndef TCPCL
  • c和java语言中的换行符

    现在行分隔符取决于系统 但在 C 程序中我使用 n 作为行分隔符 无论我在 Windows 还是 Linux 中运行它都可以正常工作 为什么 在java中 我们必须使用 n 因为它与系统相关 那么为什么我们在c中使用 n 作为新行 而不管我
  • 如何读取扩展文件属性/文件元数据

    因此 我按照教程使用 ASP net core 将文件 上传 到本地路径 这是代码 public IActionResult About IList
  • std::cout 和 std::wcout 有什么区别?

    在c 中 有什么区别std cout and std wcout 它们都控制流缓冲区的输出或将内容打印到控制台 或者它们只是相似吗 它们作用于不同的字符类型 std cout uses char作为字符类型 std wcout uses w
  • 如何修复此错误“GDI+ 中发生一般错误”?

    从默认名称打开图像并以默认名称保存 覆盖它 我需要从 Image Default jpg 制作图形 将其放在 picturebox1 image 上并在 picurebox1 上绘制一些图形 它有效 这不是我的问题 但我无法保存 pictu
  • 读取文件特定行号的有效方法。 (奖励:Python 手册印刷错误)

    我有一个 100 GB 的文本文件 它是来自数据库的 BCP 转储 当我尝试导入它时BULK INSERT 我在第 219506324 行上收到一个神秘错误 在解决此问题之前 我想看看这一行 但可惜的是我最喜欢的方法 import line
  • 如何访问另一个窗体上的ListView控件

    当单击与 ListView 所在表单不同的表单中的按钮时 我试图填充 ListView 我在 Form1 中创建了一个方法以在 Form2 中使用 并将参数传递给 Form1 中的方法 然后填充 ListView 当我调试时 我得到了传递的
  • 无法在 Windows 运行时组件库的 UserControl 中创建依赖项属性

    我想在用户控件内创建数据可绑定属性 这个用户控件包含一个 Windows 运行时组件 项目 我使用下面的代码来创建属性 public MyItem CurrentItem get return MyItem GetValue Current
  • 使用 JNI 从 Java 代码中检索 String 值的内存泄漏

    我使用 GetStringUTFChars 从使用 JNI 的 java 代码中检索字符串的值 并使用 ReleaseStringUTFChars 释放该字符串 当代码在 JRE 1 4 上运行时 不会出现内存泄漏 但如果相同的代码在 JR
  • Rx 中是否有与 Task.ContinueWith 运算符等效的操作?

    Rx 中是否有与 Task ContinueWith 运算符等效的操作 我正在将 Rx 与 Silverlight 一起使用 我正在使用 FromAsyncPattern 方法进行两个 Web 服务调用 并且我想这样做同步地 var o1
  • 未定义的行为或误报

    我 基本上 在野外遇到过以下情况 x x 5 显然 它可以在早期版本的 gcc 下编译干净 在 gcc 4 5 1 下生成警告 据我所知 警告是由 Wsequence point 生成的 所以我的问题是 这是否违反了标准中关于在序列点之间操
  • 如何将整数转换为 void 指针?

    在 C 中使用线程时 我面临警告 警告 从不同大小的整数转换为指针 代码如下 include
  • PlaySound 可在 Visual Studio 中运行,但不能在独立 exe 中运行

    我正在尝试使用 Visual Studio 在 C 中播放 wav 文件 我将文件 my wav 放入项目目录中并使用代码 PlaySound TEXT my wav NULL SND FILENAME SND SYNC 我按下播放按钮 或
  • 如何在 Blackberry Cascades 中显示具有特定号码的电话板

    我正在使用带有 C QT 和 QML 的 Blackberry Cascades 10 Beta 3 SDK 以及 Blackberry 10 Dev Alpha Simulator 和 QNX Momentics IDE 并且我正在尝试实
  • 如何将自定义 JSON 文件添加到 IConfiguration 中?

    我正在使用 asp net Autofac 我正在尝试加载自定义 JSON 配置文件 并基于该文件创建 实例化 IConfiguration 实例 或者至少将我的文件包含到默认情况下构建的 IConfiguration asp net 中
  • 如何编写一个同时需要请求和响应Dtos的ServiceStack插件

    我需要提供本地化数据服务 所有本地化的响应 Dto 都共享相同的属性 IE 我定义了一个接口 ILocalizedDto 来标记那些 Dto 在请求端 有一个ILocalizedRequest对于需要本地化的请求 Using IPlugin
  • C++ 密码屏蔽

    我正在编写一个代码来接收密码输入 下面是我的代码 程序运行良好 但问题是除了数字和字母字符之外的其他键也被读取 例如删除 插入等 我知道如何避免它吗 特q string pw char c while c 13 Loop until Ent
  • 为什么在setsid()之前fork()

    Why fork before setsid 守护进程 基本上 如果我想将一个进程与其控制终端分离并使其成为进程组领导者 我使用setsid 之前没有分叉就这样做是行不通的 Why 首先 setsid 将使您的进程成为进程组的领导者 但它也
  • 检查Windows控制台中是否按下了键[重复]

    这个问题在这里已经有答案了 可能的重复 C 控制台键盘事件 https stackoverflow com questions 2067893 c console keyboard events 我希望 Windows 控制台程序在按下某个
  • 在客户端系统中安装后桌面应用程序无法打开

    我目前正在使用 Visual Studio 2017 和 4 6 1 net 框架 我为桌面应用程序创建了安装文件 安装程序在我的系统中完美安装并运行 问题是安装程序在其他计算机上成功安装 但应用程序无法打开 edit 在客户端系统中下载了

随机推荐

  • 初始化向量的特征

    我绝不是密码学专家 我一直在 Stack Overflow 和维基百科上阅读一些问题 但在定义 IV 及其用法方面没有什么是真正 明确的 我发现的几点 IV 被添加到明文消息中以加强加密 IV 是真正随机的 每条消息都有自己独特的 IV 有
  • 使用 Jersey 客户端在 POST 中发送名称值对

    我如何将名称值对作为正文传递给泽西岛的 POST ReST 服务 类似于下面使用 Apache Commons PostMethod 的代码 final PostMethod post new PostMethod url post set
  • 为什么正则表达式的运行时间可以呈指数级增长?

    可以编写在某些情况下需要指数运行时间的正则表达式 这样的例子是 aa aa 如果有奇数个输入a它需要指数级的运行时间 测试这个很容易 如果输入仅包含as 且长度为 51 正则表达式需要几秒钟的时间来计算 在我的机器上 相反 如果输入长度为
  • Rails activerecord:总和、最大值和连接

    我有两个型号users and posts 用户可以投票和查看帖子 users id name posts id count votes count views users id created at updated at 我想要的是过去
  • 向 Array 类添加新方法

    我对数组对象有一个新的要求 所以我需要将自己的方法添加到内置 Array 类中 如何添加新方法 以便无论我创建什么 Array 对象 它也将具有我的实例方法 Use 红宝石公开课 http rubylearning com satishta
  • 在 Windows 7 的 XAMPP 1.8.3 上运行 ImageMagick

    我已经尝试了几个小时让 ImageMagick 在我的本地主机上运行 在 Windows 7 上运行 XAMPP 1 8 3 我已经检查并尝试了在该网站上找到的所有解决方案以及其他数十个解决方案 什么都不起作用 无论我尝试哪种 ImageM
  • 安装 SubGit 存储库时跳过修订

    我在用着SubGit http subgit com 克隆 SVN 存储库 修订版本中的某个位置是某个标记的 副本 当 SubGit 加载每个修订版本时 需要很长时间才能获取这个特定标签 而该标签恰好是 的副本 这会阻止复制 我尝试设置mi
  • Jquery,隐藏和显示第n项之后的列表项

    假设我有一个无序列表 如下所示 ul li One li li Two li li Three li li Four li li Five li ul 我如何使用 JQuery 隐藏最后 2 个列表项并在那里有一个 显示更多 链接 这样当单
  • “运算符=必须是非静态成员”是什么意思?

    我正在创建一个双链表 并重载了运算符 以使列表等于另一个 template
  • 如何在 spring-security-javaconfig 中添加访问拒绝处理程序

    我正在使用 spring security javaconfig 库来实现 Spring Security 如果我使用 xml 配置文件 我会使用类似这样的内容来定义自定义 拒绝访问 页面
  • JavaFX 模态窗口对 Swing 的所有权

    我有一个基于 Swing 构建的应用程序 并与 JavaFX 集成 Swing 的 JFrame 是顶层窗口 JFXPanel 包含不同的 JavaFX 控件 现在 我还集成了 JavaFX 的新警报 API 目前在显示时设置警报的所有权时
  • 使用 zsh 对于大型 /.ssh/config 文件自动完成速度较慢

    我目前有一个 ssh config 文件 其中约有 7000 行 我想看看是否有办法加快 zsh 中的自动完成功能 当我开始输入我想要 ssh 进入的服务器然后按TAB它需要大约 10 秒的时间来向我显示我可以选择的可能的主机 问题是完成
  • 推荐的最低 Android 应用 SDK

    我正在制作一个 Android 应用程序 想知道业界对支持旧版 Android 版本 如 GingerBread 和 FroYo 的想法是什么 像我这样的开发人员是否应该采取额外的步骤来使我的应用程序与这些旧版本兼容 或者它们是否已过时 我
  • 如何从主窗口调用异步方法?

    所以我写了一个快速的async方法将一些数据放入DataTable来自 Oracle 数据库 我该怎么称呼这个MainWindow 不阻塞UI线程 这async wait模型在那里并没有多大意义 async Task
  • Facebook JavaScript SDK:FB.ui 打开一个弹出窗口

    我试图在 facebook iframe 应用程序中使用以下代码显示 发布到您的墙 提要对话框 div div
  • 增加 parallel.foreach 范围之外的计数值

    如何增加parallel foreach 循环范围之外的整数值 同步对并行循环之外的对象的访问的最简单方法是什么 var count 0 Parallel ForEach collection item gt action item inc
  • 在 Xcode 中查找方法引用

    Xcode 中有没有办法找到调用方法或属性的所有位置 例如 在 Eclipse 中 您可以右键单击一个方法并选择查找参考资料 Xcode中有类似的东西吗 选择您感兴趣的方法 或将文本光标置于其中 通过编辑器左上角的图标打开 相关文件 菜单
  • 使用链表压栈操作失败

    我正在尝试使用单个链表创建堆栈 我的推送操作不会将数据插入链表 这是我到目前为止所尝试过的 typedef struct element int data struct element next node 推送方法 void push no
  • 在欧几里得空间中嵌入图

    我有一个总无向图 其中节点表示平面上点上的点 边是点之间的近似欧几里德距离 我想将此图 嵌入 到二维空间中 也就是说 我想将每个顶点转换为 x y 位置元组 以便对于任意两个两个顶点 v 和 w 边 v w 的权重接近 dist v w 例
  • 如何保持指针之间的 const 正确性?

    我试图对一个真正 const 的类进行 const 操作 它不会更改该类指向的数据 例如 class Node public int val class V public Node node what is the change that