注: この質問は前の質問に続きます。新しい質問として引き続き質問しても問題ないことを願っています。
次のようなツリー クラスの「3.5 ビッグ ルール」(コピー アンド スワップ イディオム) を実装しようとしています。
class Tree
{
friend void swap(Tree &first, Tree &second); // Swap function
public:
Tree(const double &a, const double &b, int depth); // Public constructor (derived from the default (private) constructor)
Tree(const Tree &other); // Copy constructor
~Tree(); // Destructor
Tree & operator=(Tree other); // Copy-assignement operator
private:
Tree(double *a, double *b, int depth, int maxDepth); // Default (private) constructor
double *a, *b;
int depth, maxDepth;
Tree *leftChild, *rightChild;
};
私はこのガイドラインに従うように努めてきました。私のコピー代入演算子は次のようになります。
Tree & Tree::operator=(Tree other)
{
swap(*this, other);
return *this;
}
パブリックコンストラクターを機能させるのに苦労しています。誰かが私に次のようなことを提案しました:
Tree::Tree(const double &a, const double &b, int depth)
{
double aTemp(a), bTemp(b);
swap(*this, Tree(&aTemp, &bTemp, depth, depth));
}
このアイデアが機能するかどうかはわかりません。いずれにせよ、コンパイラから次のエラーが表示されます。
invalid initialization of non-const reference of type 'Tree&' from an rvalue of type 'Tree'
in passing argument 2 of 'void swap(Tree&, Tree&)'
代わりに、次のアイデアを試しました。これはうまくいくと思いました。
Tree::Tree(const double &a, const double &b, int depth)
{
double aTemp(a), bTemp(b);
*this = Tree(&aTemp, &bTemp, depth, depth);
}
しかし、それも機能していないようです。*this = Tree(&aTemp, &bTemp, depth, depth)
問題は、コピー代入演算子( )を呼び出すときにコピーコンストラクターを呼び出す必要があることだと思います(コピー代入演算子の引数は値渡しであるため)が、これが行われていないようです。私はなぜなのか理解していない。
助けてくれてありがとう!