如何保存指向抽象基类的指针/引用,但在 c++ 中仍然可以复制
How to hold a pointer/reference to abstract base class but still be copyable in c++
假设我在C++中有一些ABC:
struct IRun {
virtual ~IRun() {}
virtual void run() =0;
};
我还有另一个类,我希望为它提供此接口的实例:
struct Other {
IRun* runner_;
};
问题是我必须将runner_作为指针来获取虚拟调度(引用已导出,因为它们不可分配(。 我想在我的用法中变得"现代",所以runner_可能属于一个聪明的指针。
我希望其他是可复制的并且不共享状态,所以shared_ptr和unique_ptr都出来了。 我能看到的唯一选择是编写我自己的,通过 clone(( 虚拟函数复制底层对象? 标准C++ (<= C++11( 中是否有适用于此用例的内容?
这是正确的,C++中没有任何内置功能可以执行此操作。
您必须创建一个创建副本的clone()
虚函数,并在IRun
的每个子类中实现它。
相关文章:
- 代码在main()中运行,但在函数中出现错误
- 链接阶段在Ubuntu上失败,但在MacOS上失败
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 断言中的Fold表达式在某些计算机上编译,但在其他计算机上不编译
- 换位表导致测试失败(但在游戏中运行良好)
- 库标题在标题中不可见,但在 cmake build 下.cpp文件中完全可见.为什么?
- 树莓上的 Libtorch 无法加载 pt 文件,但在 ubuntu 上工作
- 在成员dynamic_bitset上使用 boost::from_block_range 时出错,但在本地dynamic
- 编译在我的 Mac 上工作,但在集群 (Linux) 上不起作用
- 我编写了代码将十进制分数转换为其二进制等效数.它编译得很好,但在执行时挂起
- 我的代码运行良好,但在游戏循环中中断
- C++ assigment std::list:<typename>:itrator 在 main 中工作,但在方法中它不起作用
- C++代码在台式机上工作正常,但在笔记本电脑上则不行
- 实现 DFS 在较短的输入下工作正常,但在较大的输入下会抛出分段错误
- 点云库在VS 2019中不起作用,但在VS 2017中确实有效
- C++ Python 模块在 Blender 中崩溃,但在 Python 控制台中不会崩溃
- 分段 Linux Ubuntu 中的 g++ 错误,但在 Windows 中的 g++/MingW 中,在 C++ 中打
- 为什么数组大小信息可用于"sizeof"运算符和 delete[] 运算符,但在将数组作为参数传递到
- 如何处理没有默认构造函数但在另一个构造函数中构造的对象?