2

QuadTreeというクラスがあります。私は最近、そのためのコピーコンストラクターを作成しました。

QuadTree(const QuadTree &cpy);

たとえば、このコンストラクターにまだ入力していないとします。使用されていない限り、コードは正常にコンパイルされます。これで、subtractTreesという関数ができました。

QuadTree * subtractTrees(QuadTree LHS, QuadTree RHS);

コピーコンストラクターを作成する前は、このコードは問題なく機能していました。この関数を使用してプログラムをコンパイルすると、次のエラーが発生します。

Undefined Referance to QuadTree::QuadTree(QuadTree const&)

私のコピーコンストラクターがコードで使用されており、まだ入力されていないために発生するエラーのように。これは、このようなパッシブ関数(subtractTrees)へのコピーコンストラクター呼び出しがコピーコンストラクターを呼び出すことを意味しますか?

もしそうなら、コピーコンストラクターを使用している間にこれが発生するのを防ぐ方法はありますか?これを行う必要がある理由は、このような関数で使用するためにコピーすると、コードの速度が大幅に低下するためです。しかし、ツリーを簡単にコピーするには、コピーコンストラクターが必要です。

編集:コピーコンストラクターに入力するだけでエラーを修正しましたが、質問は

  1. そもそもコピーコンストラクタなしでどのように機能したのでしょうか。
  2. 使用するたびにツリーをコピーしないことで速度を節約しようとした場合、この不要なコピーコンストラクターを利用する方法はありますか?
4

2 に答える 2

4

You must have an constructor defined for your class QuadTree, when you do that the compiler does not generate the implicit copy constructor, it assumes you will provide your own if you need it.

When you add the function, which takes the type QuadTree by value a copy constructor is needed to perform these copies and hence the compiler complains.

QuadTree * subtractTrees(QuadTree LHS, QuadTree RHS);
                         ^^^^^^^^^^^^  ^^^^^^^^^^^^^

Pass by value needs copy constructor.

If so is there a way to stop this from occurring whilst still using the copy constructor?

I am not sure I understand the question. You need a copy constructor if you want to create an copy of your class object. If you want to avoid the copies pass your object by const reference.

QuadTree * subtractTrees(const QuadTree &LHS, const QuadTree &RHS);
于 2012-05-10T04:19:33.637 に答える
1

コピーコンストラクターを宣言していなかった場合、コンパイラーは暗黙的にコピーコンストラクターを提供しました。そのため、コードは以前は機能していました。QuadTreeに値を渡すためsubtractTrees、この暗黙のコピーコンストラクターは、独自のコピーコンストラクターを宣言する前に呼び出されていました。独自のコピーコンストラクターを宣言すると(ただし定義しなかった場合)、コンパイラーはコピーコンストラクターの定義を暗黙的に停止したため、コピーコンストラクターへの以前のすべての呼び出し(subtractTrees関数内など)で未定義の参照が生成されます。

関数内のコピーを避けたい場合はsubtractTrees、参照によってパラメーターを渡すことができます。

QuadTree * subtractTrees(const QuadTree &LHS, const QuadTree &RHS);
于 2012-05-10T04:30:14.653 に答える