11

バイナリ ノード、単項ノード、ターミナル ノードなど、いくつかの異なるノード タイプを持つツリーを作成しています。すべてのノードが継承する ABC があります。次のように、ツリーの再帰的なコピー コンストラクターを作成しようとしています。

class gpnode
{
public:
  gpnode() {};
  virtual ~gpnode() {};
  gpnode(const gpnode& src) {};

  gpnode* parent;
}

class bnode:gpnode
{
public:
  bnode() {//stuff};
  ~bnode() {//recursive delete};

  bnode(const bnode& src)
  {
    lnode = gpnode(src.lnode);
    rnode = gpnode(src.rnode);

    lnode->parent = this;
    rnode->parent = this;
  }

  gpnode* lnode;
  gpnode* rnode;
}

class unode:gpnode
{
public:
  unode() {//stuff};
  ~unode() {//recursive delete};

  unode(const unode& src)
  {
    node = gpnode(src.node);

    node->parent = this;
  }

  gpnode* node;
}

私の問題は私ができないことです

node = gpnode(src.node);

gpnode は仮想クラスだからです。私はそれをできた

node = unode(src.node);

しかし、u ノードの子が b ノードの場合は機能しません。必要なコピーコンストラクターをインテリジェントに呼び出すにはどうすればよいですか?

4

3 に答える 3

4

これを行うcloneには、適切な型のポインターを返すオブジェクトのメソッドを提供する必要があります。すべてのクラスにコピー コンストラクターがある場合、それは次のように簡単です。

node* clone() const {
    return new node(*this);
}

node-メソッドを書いているクラスはどこですかclone。もちろん、基本クラスでそのメソッドを宣言する必要があります。

virtual gpnode* clone() const = 0;
于 2011-10-27T07:50:03.080 に答える
3

仮想コンストラクターを使用します。

于 2011-10-27T07:49:24.187 に答える