簡體   English   中英

派生類數組的C ++構造函數副本

[英]C++ constructor copy of an array of derived classes

盡管在復制構造函數中有許多帶有管理指針的文章,但我沒有找到合適的答案來正確實現以下內容。

類A的對象“ a”存儲元素的“制表符”數組,這些數組是指向類B1或B2的元素的指針,均從類B派生。

我想通過調用副本構造函數來保存“ a”的副本(以便稍后還原)。 我的問題是在此副本構造函數中分配內存,以復制'tab [i]'元素的內容。

必須有一種規范的方法(我想無需調用<dynamic_cast>來確定它是B1還是B2類型)。

這是我用來說明問題的MWE:

#include <iostream>
using namespace std;


//-----------------------
class B {
public:
  virtual void display()=0;
};

//-----------------------
class B1 : public B {
public:
  B1() : val(1)  // ctor
  {}  
  void display() {
    cout << val << endl;
  }
private:
  int val;

};
//-----------------------
class B2 : public B {
public:
  B2() : val(2)  // ctor
  {}
  void display() {
    cout << val << endl;
  }
private:
  int val;

};

//---------- A -------------
class A {

public:
  A () {            // ctor
    tab = new B * [2];
    tab[0] = new B1;
    tab[1] = new B2;
  } 

  A (A const &orig)         // copy ctor
    : tab(orig.tab)
  {          
    // ... HOW should i make a copy of the tab[i] elements ?...
    // ... as i do not know if tab[i] is type B1 or B2 ...
  }

  void display() {
    tab[0]->display();   
    tab[1]->display();   
  }


private:
  B ** tab;
};




//------M A I N ---------

int main() {
  A a;
  a.display();

  return 0;
}

您不能通過使用dynamic_cast或調用虛擬方法(然后將其分派到具體類型)來確定B的具體類型,而不執行此操作。

通常可以通過在B接口上使用“克隆”模式來解決此問題,並將函數添加到Bvirtual B* clone() const = 0; 每個實現都分配並返回其自身的適當副本。

還要注意,您沒有刪除示例中分配的任何內存。 記住要在析構函數中執行此操作,或者最好使用智能指針(如std :: unique_ptr)!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM