如何以 const 形式返回指向指针列表的私有指针?

2024-04-17

我有一个指向指针列表的指针,作为私有变量。我还有一个 getter,它返回指向列表的指针。我需要保护它免受更改。

我找不到如何使用reinterpret_cast 或const_cast 对此。

class typeA{
    shared_ptr<list<shared_ptr<typeB>>> l;
public:
   shared_ptr<list<shared_ptr<const typeB>>> getList(){return (l);};
};

编译器返回:

   error: could not convert ‘((typeA*)this)->typeA::x’ from ‘std::shared_ptr<std::__cxx11::list<std::shared_ptr<typeB> > >’ to ‘std::shared_ptr<std::__cxx11::list<std::shared_ptr<const typeB> > >’|
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

看起来就像const shared_ptr<list<shared_ptr<typeB>>> and shared_ptr<const list<shared_ptr<typeB>>>工作正常。

可以退货吗l作为一个完整的常量,例如:

const shared_ptr<const list<shared_ptr<const typeB>>>

或者至少喜欢:

shared_ptr<list<shared_ptr<const typeB>>> 

?

用引用代替指针不是一个选择。声明l as shared_ptr<list<shared_ptr<const typeB>>>也不是一个想要的解决方案。

编辑:不再有“int”了。

看来这不可能完全符合我的要求,但建议的解决方案很好。是的,复制指针是可以接受的。

我的错是我没有立即放入 typeB。我知道引用相对于指针的一些优点,但我希望有一些类似的解决方案。


您可以创建一个新列表const int来自您的原始列表并返回:

std::shared_ptr<std::list<std::shared_ptr<const int>>> getList(){
    return std::make_shared<std::list<std::shared_ptr<const int>>>(l->begin(), l->end());
}

如果你想阻止人们对返回的列表进行更改,也可以将其设置为常量:

std::shared_ptr<const std::list<std::shared_ptr<const T>>> getList(){
    return std::make_shared<const std::list<std::shared_ptr<const T>>>(l->cbegin(), l->cend());
}

该函数返回的共享指针并不指向原始列表,而是指向新创建的列表。

另一种选择可能是提供迭代器,当取消引用时,该迭代器返回const T& (where T是您实际存储的类型)。这样,您就无需在每次查看时都复制整个列表。例子:

#include <iostream>
#include <list>
#include <memory>

struct example {
    int data;
    example(int x) : data(x) {}
};

template <class T>
class typeA {
    std::shared_ptr<std::list<std::shared_ptr<T>>> l = std::make_shared<std::list<std::shared_ptr<T>>>();
public:
    template< class... Args >
    void add( Args&&... args ) {
        l->emplace_back(std::make_shared<T>(std::forward<Args>(args)...));
    }

    // a very basic iterator that can be extended as needed   
    struct const_iterator {
        using uiterator = typename std::list<std::shared_ptr<T>>::const_iterator;
        uiterator lit;
        const_iterator(uiterator init) : lit(init) {}
        const_iterator& operator++() { ++lit; return *this; }
        const T& operator*() const { return *(*lit).get(); }
        bool operator!=(const const_iterator& rhs) const { return lit != rhs.lit; }
    };

    const_iterator cbegin() const noexcept { return const_iterator(l->cbegin()); }
    const_iterator cend() const noexcept { return const_iterator(l->cend()); }
    auto begin() const noexcept { return cbegin(); }
    auto end() const noexcept { return cend(); }
};

int main() {
    typeA<example> apa;
    apa.add(10);
    apa.add(20);
    apa.add(30);
    for(auto& a : apa) {
        // a.data = 5; // error: assignment of member ‘example::data’ in read-only object
        std::cout << a.data << "\n";
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何以 const 形式返回指向指针列表的私有指针? 的相关文章

  • 电话号码的正则表达式,不允许全零

    需要您的正则表达式帮助 我当前的正则表达式是 d 8 最小长度为 8 不允许包含字母 特殊字符和空格 我还想禁止全零 如 00000000 Thanks 该模式应该可以满足您的需求 0 d 8 The 0 部分是负前瞻 将阻止仅输入零 Ex
  • 键盘加速器在 UWP 应用中停止工作

    我正在尝试将键盘加速器添加到 UWP 应用程序中的 CommandBar 菜单项 当应用程序启动时 这工作正常 但在我第一次打开溢出菜单后 加速器停止工作 这似乎不会发生在主要命令 菜单之外 上 只有溢出菜单内的辅助命令才会发生 此外 单击
  • 在Application_AquireRequestState事件中用POST数据重写Url

    我有一个在其中注册路线的代码Application AcquireRequestState应用程序的事件 注册路由后 我会在 Http 运行时缓存中设置一个标志 这样我就不会再次执行路由注册代码 在此事件中注册路线有特定原因Applicat
  • 访问“if”语句之外的变量

    我怎样才能使insuranceCost以外可用if陈述 if this comboBox5 Text Third Party Fire and Theft double insuranceCost 1 在 if 语句之外定义它 double
  • 无法从 Web api POST 读取正文数据

    我正在尝试从新的 Asp Net Web Api 中的请求中提取一些数据 我有一个像这样的处理程序设置 public class MyTestHandler DelegatingHandler protected override Syst
  • 从 future 中检索值时的 SIGABRT

    我在使用 C 11 future 时遇到问题 当我打电话时wait or get 关于返回的未来std async 程序接收从mutex标头 可能是什么问题呢 如何修复它 我在 Linux 上使用 g 4 6 将以下代码粘贴到 ideone
  • 导出类时编译器错误

    我正在使用 Visual Studio 2013 但遇到了一个奇怪的问题 当我导出一个类时 它会抛出 尝试引用已删除的函数 错误 但是 当该类未导出时 它的行为会正确 让我举个例子 class Foo note the export cla
  • 如何在 Asp.net Gridview 列中添加复选框单击事件

    我在 asp 中有一个 gridview 其中我添加了第一列作为复选框列 现在我想选择此列并获取该行的 id 值 但我不知道该怎么做 这是我的 Aspx 代码
  • 矩阵向量变换

    我正在编写一个代码来制作软件蒙皮器 骨骼 皮肤动画 并且我正处于 优化 阶段 蒙皮器工作得很好 并且在 Core 上 1 09 毫秒内对 4900 个三角形网格与 22 个骨骼进行蒙皮Duo 2 Ghz 笔记本 我需要知道的是 1 有人可以
  • 存储过程上的 OdbcCommand - 输出参数上出现“未提供参数”错误

    我正在尝试执行存储过程 通过 ODBC 驱动程序针对 SQL Server 2005 但收到以下错误 过程或函数 GetNodeID 需要参数 ID 但未提供该参数 ID 是我的过程的 OUTPUT 参数 在存储过程中指定了一个输入 mac
  • 单线程公寓问题

    从我的主窗体中 我调用以下命令来打开一个新窗体 MyForm sth new MyForm sth show 一切都很好 但是这个表单有一个组合框 当我将其 AutoCompleteMode 切换为建议和追加时 我在显示表单时遇到了这个异常
  • C# datagridview 列转入数组

    我正在用 C 构建一个程序 并在其中包含一个 datagridview 组件 datagridview 有固定数量的列 2 我想将其保存到两个单独的数组中 但行数确实发生了变化 我怎么能这样做呢 假设一个名为 dataGridView1 的
  • 无法加载文件或程序集“EntityFramework,版本=6.0.0.0”

    我究竟做错了什么 我该如何解决这个问题 我有一个包含多个项目的解决方案 它是一个 MVC NET 4 5 Web 应用程序 在调试模式下启动后调用其中一个项目时 出现此错误 导致此错误的项目具有以下参考 两个都是版本6 0 0 0 应用程序
  • 从事务范围调用 WCF 服务方法

    我有这样的代码 using TransactionScope scope TransactionScopeFactory CreateTransactionScope some methodes calls for which scope
  • C++ [Windows] 可执行文件所在文件夹的路径[重复]

    这个问题在这里已经有答案了 我需要访问一些文件fstream在我的 Windows 上的 C 应用程序中 这些文件都位于我的exe文件所在文件夹的子文件夹中 获取当前可执行文件的文件夹路径的最简单且更重要的 最安全的方法是什么 Use 获取
  • 使用 Chrome 和 Selenium 设置 LocalStorage

    我正在尝试使用 OpenQA Selenium 和 Chrome 设置本地存储键和值 我认为这相当微不足道 但我似乎无法让它发挥作用 我对 C 很陌生 所以我可能错过了一些东西 无论如何 我有这个功能 public static void
  • 如何设置 CMake 与 clang 交叉编译 Windows 上的 ARM 嵌入式系统?

    我正在尝试生成 Ninja makefile 以使用 Clang 为 ARM Cortex A5 CPU 交叉编译 C 项目 我为 CMake 创建了一个工具链文件 但似乎存在错误或缺少一些我无法找到的东西 当使用下面的工具链文件调用 CM
  • 启动画面后主窗口出现在其他窗口后面

    我有一个带有启动屏幕的 Windows 窗体应用程序 当我运行该应用程序时 启动屏幕显示正常 消失并加载应用程序的主窗体 但是 当我加载主窗体时 它出现在包含该应用程序的 Windows 资源管理器目录下 这是运行启动画面然后运行主窗体的代
  • c# 模拟 IFormFile CopyToAsync() 方法

    我正在对一个异步函数进行单元测试 该函数将 IFormFile 列表转换为我自己的任意数据库文件类列表 将文件数据转换为字节数组的方法是 internal async Task
  • 无法使 Polly 超时策略覆盖 HttpClient 默认超时

    我正在使用 Polly 重试策略 并且正如预期的那样 在重试过程中HttpClient达到 100 秒超时 我尝试了几种不同的方法来合并 Polly 超时策略 将超时移至每次重试而不是总计 但 100 秒超时仍然会触发 我读过大约 5 个

随机推荐

  • 实体框架多重聚合性能

    我有一个关于实体框架查询构建的问题 Schema 我有一个这样的表结构 CREATE TABLE dbo DataLogger ID bigint IDENTITY 1 1 NOT NULL ProjectID bigint NULL CO
  • 使用 Ransack 搜索值数组

    我是 Ransack 的新手 我遇到了 Ransack 未明确涵盖的案例 我基本上试图搜索一个值 但搜索到的值包含在一个数组中 CODE 最后还有这一段user rep code list cont这是用户的默认数组属性 目前看起来像这样
  • 如何在javascript函数中获取Table的所有td值

    我有一个数据表 其中显示子行展开折叠功能 它运行良好 但我想获取表的最后一个 td 的内容 现在我创建了一个函数 该函数在数据表中放置一些硬编码值扩大的地方 在那个地方我想得到那些 td 值 这是我发布的代码
  • 如何向JTable中插入数据?

    我编写此代码用于在表中显示字符串 但它没有显示并且没有任何效果 有什么问题吗 public pamnel initComponents String columnNames First Name Last Name Sport of Yea
  • ASP.NET MVC 和 Web 服务

    向我的 ASP NET MVC 项目添加 Web 服务是否会破坏 MVC 的整个概念 该 Web 服务 WCF 依赖于我的 MVC 项目中的模型层来与后端进行通信 因此在我看来 它需要成为 MVC 解决方案的一部分 我应该将其添加到控制器层
  • 让 Scala 在 .net 上运行的分步指南?

    我从未使用过 Net 框架 需要向某人证明 Scala 确实可以在 Net 上运行 我需要使用 Scala 进行 快速而肮脏 的 Net 设置 以处理一些现有的 JVM Scala 代码 我找不到这方面的分步指南 我将不胜感激一些这方面的资
  • 如何在 Xcode 中禁用一个文件的优化

    我的 Xcode 项目依赖于另一个库 当我使用以下命令构建项目时 这会导致项目出现错误 O3 option 这些错误仅存在于一个文件中 所以我想关掉 O3 该文件的选项 是否可以 打开目标 看下Build Phases 打开Compile
  • 向数据框添加行的有效方法

    由此question https stackoverflow com questions 28056171 how to build and fill pandas dataframe from for loop和其他人似乎不建议使用con
  • 如何在第一个选项卡验证完成后启用第二个选项卡

    我有包含以下字段的选项卡 div ul li a href tabs 1 Tab1 a li li a href tabs 2 Tab2 a li li a href tabs 3 Tab3 a li li a href tabs 4 Ta
  • 将字节转换为图像时出现错误“参数无效”

    我正在将字节转换为图像 但出现错误 参数无效 我正在粘贴我的代码 请检查代码并建议我做对还是错 Image arr1 byteArrayToImage Bytess 这就是函数 public static Image byteArrayTo
  • 为什么thread_local不能应用于非静态数据成员以及如何实现线程本地非静态数据成员?

    Why may thread local不适用于非静态数据成员 接受的答案这个问题 https stackoverflow com questions 10999131 can you use thread local variables
  • Solr 高亮显示

    我看到了这个帖子here https stackoverflow com questions 4058913 how to highlighting search results using apache solr with php cod
  • SAP Web IDE 显示有关 ES6+ 功能的错误

    for var items in selectedContexts var downloadModel parsed parsed items toString split 1 parsed items toString split 2 v
  • Gradle 发出错误“无法创建类型为‘AppPlugin’的插件”

    我正在尝试使用 gradle 创建一个简单的 android 项目 我在一台装有 Debian GNU Linux 7 wheezy 的计算机上工作 我遵循了中的建议Gradle 插件用户指南 Android 工具项目网站 http too
  • 如何将 Twitter 小部件集成到 Reactjs 中?

    我想将 Twitter 小部件添加到 React 中 但我不知道从哪里开始或如何做 我对 React JS 很陌生 下面是 HTML 版本的代码 div class Twitter a class twitter timeline href
  • 如何在 Meteor 中缓存数据?

    感谢大家 最近我想在meteor上建立一个小型cms 但有一些问题 1 缓存 页面缓存 数据缓存等 例如 当人们搜索某篇文章时 在服务器端 Meteor publist articles function keyword return Ar
  • chrome.storage 在 chrome 扩展中未定义

    我正在开发一个 Google Chrome 扩展程序 并且已经为此工作了一段时间 所以它已经安装了一段时间 我更新了清单文件以包含 存储 权限并重新加载扩展 但是 当我在控制台中尝试时 chrome storage is undefined
  • Microsoft Bot 在 WebChat 中显示不必要的重复消息?

    当用户第一次访问我的聊天室时 他们会收到欢迎消息 并立即被要求提供他们的名字 一旦用户输入他们的名字 就会出现欢迎消息 并再次显示输入名字的文本提示 只有在他们第二次输入名字后 机器人才会继续处理下一个有关姓氏的问题 此外 当用户最终在第一
  • 在 Java JFrame 上添加图像 - Netbeans

    我在用着NetBeans 7 1用 Java 编写代码 我已经创建了一个JFrame充满了一些labels textbox and buttons 我该如何导入一些图像 JPG PNG etc 从我的电脑到同一个JFrame 在框架的特定位
  • 如何以 const 形式返回指向指针列表的私有指针?

    我有一个指向指针列表的指针 作为私有变量 我还有一个 getter 它返回指向列表的指针 我需要保护它免受更改 我找不到如何使用reinterpret cast 或const cast 对此 class typeA shared ptr