将子对象复制到父类型指针中

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实现的virtualclone()函数。 @πάντα ῥεῖ 没有内置方法可以达到同样的效果吗? 不,没有内置方法。 【参考方案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;
    
  // [...]
;

除此之外,在您的示例中,您没有显示任何继承(构造函数调用除外)。

【讨论】:

我认为可能有本地方式,但我会采取虚函数路线,谢谢!刚刚更正了示例,感谢您指出 请问您为什么使用花括号构造函数而不是普通构造函数? 它是统一初始化语法的一部分,它消除了任何歧义(例如,使用调用运算符)。

以上是关于将子对象复制到父类型指针中的主要内容,如果未能解决你的问题,请参考以下文章

深拷贝 NAPI::Value 对象

怎么用js代码复制父标签底下子标签以及样式,再将子标签加入到父标签中

C++:我可以将子对象放入父对象数组中吗? [复制]

实体框架 6:将子对象添加到父列表与将子对象的导航属性设置为父对象

如何复制 C++ 指针数据? [复制]

如果继承类型受到保护,我可以使基类的指针指向派生对象吗? [复制]