在c++中是否有一种方法可以使用一个预先存在的对象作为第一个对象的子对象来创建一个对象?

Is there a way to create an object using a pre-existing object as a sub-object of the first in C++?

本文关键字:对象 一个对象 创建 存在 是否 c++ 一种 方法 一个 可以使      更新时间:2023-10-16

那么,假设我们有class Parentclass Offspring,它们继承自class Parent。根据我的理解,当我创建一个Offspring对象时,也创建了一个Parent对象并与Offspring对象相关联。问题是,如果我已经创建了一个独立的Parent对象,我可以将它用作Offspring对象创建时包含的Parent对象吗?

。是否有可能不在Offspring对象中创建新的Parent对象,而在其位置使用原始的(并且独立的)?只是将原始Parent对象的数据复制到Offspring对象中创建的数据显然不是我想要的。

这是可能的。如果Parent有一个move构造函数,那么你可以这样写:

class Offspring : public Parent {
  double m_x;
 public:
  Offspring(Parent && p, double x)
      : Parent(std::move(p))
      , m_x(x) 
  { }
}

我认为这是你在不做一些危险和粗略的事情的情况下所能得到的最接近的结果。虽然这种技术可能无法避免复制Parent的数据,但它可以更有效。例如,如果Parent是std::vector,那么上面的代码将通过从现有vector移动来初始化Offspring的基类。这将只需要移动24字节的数据,而不是向量指向的所有数据。

我想你可能想阅读更多以上的移动语义,看看它如何适合你的类。

我相信你想要的是能够使用多个Offspring的现有Parent实例。我之所以这么说,是因为你似乎在担心抄袭,而这通常是无关紧要的。

您可以将Parent定义为一个纯接口,并将接口本身的实现定义为一个独立的父接口。

struct Parent {
    virtual ~Parent () = default;
    virtual void foo () = 0;
    //...
};
class Mother : public Parent {
public:
    void foo () { /* ... */ }
    //...
};

然后,您的Offspring可以接受Parent来委托实现。

class Offspring : public Parent {
    Parent &p_;
public:
    Offspring (Parent &p) : p_(p) {}
    void foo () { p_.foo(); }
    //...
};

现在,一个Mother可以是多个Offspring的父节点。

Mother m;
Offspring o1(m);
Offspring o2(m);
相关文章: