双指针对象数组 - 克隆元素

时间:2016-01-04 15:41:35

标签: c++ arrays class pointers inheritance

我试图抓住继承和Deep Copy,但我遇到了一些麻烦。 我有3个类(1个Base和2个Derived),如下所示:

class Base {
protected:
    int id;
public:
    Base(int i) : id(i) {};
    virtual ~Base();
};

class DeriveA : public Base {
    int specialID;
public:
    DeriveA(int s, int i) : Base(i), specialID(s) {};
    ~DeriveA();
};

class DeriveB : public Base {
    int specialID;
public:
    DeriveB(int s, int i) : Base(i), specialID(s) {};
    ~DeriveB();
};

在我的主要上我有这样的事情:

int main() {

    Base **Array;
    int i, n;
    Array = new Base*[5];
    for (i = 0 ; i < 5 ; i++) {
        n = rand() % 2;
        if (n)
            Array[i] = new DeriveA(i, n);
        else
            Array[i] = new DeriveB(i, n);
    }
}

如果满足特定情况,我想将数组对象硬复制到其他对象上。我发现很难为它制作一个复制构造函数,因为Array[0] = Array[2];对我来说不起作用。我不想使用任何矢量或std :: copy,因为那不是我的&#34;教育&#34;目标

PS 1:为此,赋值运算符更好,因为我已经初始化了数组的所有对象。

PS 2:由于它是通用代码,因此我遗漏了一些错误。请忽略它们并专注于这个问题。

2 个答案:

答案 0 :(得分:3)

首先,您应该分配Base*数组:

Array = new Base*[5];

这就是初始化元素指针的方法:

Array[i] = new DeriveA(i,n);

不喜欢这样:

// * added for further clarification, otherwise invalid and rejected at compilation
*Array[i] = DeriveA(i,n);

因为那是:

  1. 取消引用未初始化的指针(未定义的行为)
  2. object slicing
  3. 请注意,您的Basemissing a virtual destructor

    然后当然是释放...你可以找到如何做到here

答案 1 :(得分:2)

如果要克隆对象,而不是将指针复制到同一对象,则可以使用虚拟克隆函数:

class Base {
public:
    virtual Base* clone() const = 0;
    virtual ~Base();  // Don't forget 'virtual' here
};

class DeriveA : public Base {
public:
    virtual Base* clone() const { return new DeriveA(*this); }
};

class DeriveB : public Base {
public:
    virtual Base* clone() const { return new DeriveB(*this); }
};


// ...

Array[0] = Array[2]->clone();