问题标签 [virtual-copy]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
319 浏览

c++ - C++类继承问题

嗨,我有两个类,一个叫做指令,一个叫做 LDI,它继承自指令类。

然后我创建了一个指令类型的指针并尝试指向一个新的 LDI 类型的实例。

我收到以下编译器错误。任何想法我做错了什么?

0 投票
3 回答
2831 浏览

c++ - C++ 虚拟构造函数,没有 clone()

我想对指向多态类的指针的 STL 容器执行“深拷贝” 。

我知道原型设计模式,它是通过Virtual Ctor Idiom实现的,如C++ FAQ Lite, Item 20.8中所述。
它简单明了:

那么深拷贝是:

缺点

正如 Andrei Alexandrescu所说

clone()实现必须在所有派生类中遵循相同的模式;尽管其结构重复,但没有合理的方法来自动定义clone()成员函数(即除了宏之外)。

此外,客户ABC可能会做坏事。(我的意思是,没有什么能阻止客户做坏事,所以它发生。)

更好的设计?

我的问题是:是否有另一种方法可以使抽象基类可克隆,而无需派生类编写与克隆相关的代码?(助手类?模板?)


以下是我的背景。希望这将有助于理解我的问题。

我正在设计一个类层次结构来对一个类执行操作Image

图像操作是用户定义的:类层次结构的客户端将实现他们自己的类派生自ImgOp

可以对图像按顺序执行多个操作:

如果有多个图像,则可以将集合拆分并在多个线程上共享。为确保“线程安全”,每个线程必须拥有自己的所有操作对象的副本v--v成为要在每个线程中深度复制的原型。

编辑:线程安全版本使用原型设计模式来强制复制指向对象——而不是 ptrs:

当图像操作类很小时,这很有意义:不要序列化对ImgOps 的唯一实例的访问,而是为每个线程提供自己的副本。

困难的部分是避免新ImgOp派生类的编写者编写任何与克隆相关的代码。(因为这是实现细节——这就是为什么我用奇怪的重复模式驳回了保罗的答案。)