将子对象复制到父类型指针中
Posted
技术标签:
【中文标题】将子对象复制到父类型指针中【英文标题】:copy-construct child into parent type pointer 【发布时间】:2019-04-27 19:41:08 【问题描述】:我有一个有多个孩子的父类
namespace var
enum type t_int, t_float, t_string, t_null;
class root
public:
type t = t_null;
root(type t) : t(t)
class v_int : public root
public:
int value;
v_int() : root(t_int)
v_int(int value) : value(value), root(t_int)
class v_float : public root
public:
float value;
v_float() : root(t_float)
v_float(float value) : value(value), root(t_float)
class v_string : public root
public:
std::string value;
v_string() : root(t_string)
v_string(std::string value) : value(value), root(t_string)
还有一个函数需要在root*
中创建一个孩子的副本,但孩子已经作为根* 出现了,我希望避免切换来查找类型,调用特定的构造函数并分配它到 root*,因为它对所有孩子都是相同的。
var::root* source = new var::v_int(5);
var::root* copy = /*copy of source*/;
是的,我知道,原始指针,我怎么敢!!!无论如何,我不是在这里讨论指针类型的选择。
我知道我可以用一个类和一个联合做类似的事情,但是这个类会被大量使用,我不希望未来的“v_uint8_t”占用与“v_int64_t”一样多的空间
【问题讨论】:
使用为每个type实现的virtual
clone()
函数。
@πάντα ῥεῖ 没有内置方法可以达到同样的效果吗?
不,没有内置方法。
【参考方案1】:
我不确定我是否理解您的要求,您是否要求一种复制元素而无需切换潜在子类的方法?
如果是这种情况,只需将纯虚成员函数添加到您的 root
类:
class root
// [...]
public:
virtual root* clone() const = 0;
// [...]
;
并在子类中实现:
class v_int : public root
// [...]
public:
root* clone() const override
return new v_intthis->value;
// [...]
;
除此之外,在您的示例中,您没有显示任何继承(构造函数调用除外)。
【讨论】:
我认为可能有本地方式,但我会采取虚函数路线,谢谢!刚刚更正了示例,感谢您指出 请问您为什么使用花括号构造函数而不是普通构造函数? 它是统一初始化语法的一部分,它消除了任何歧义(例如,使用调用运算符)。以上是关于将子对象复制到父类型指针中的主要内容,如果未能解决你的问题,请参考以下文章
怎么用js代码复制父标签底下子标签以及样式,再将子标签加入到父标签中