1

このトピックに関する記事をいくつか読みましたが、自分のコードをコンパイルするにはまだ問題があります。

私はクラスAを持っています:

class A
{
public:
     List<int> data;  
     A(){} 
     A(A&){}
     A& operator= (const A& a)
     {
         // copy the data from a to data  
     }       
};

クラス B はクラス A を呼び出します。

class B
{
public:
    A makeA()
    {
        A a;
        return a;
    }
    A getA()
    {
        A a = makeA();
        return a;
    }
};

Linux で g++ を使用してコードをコンパイルすると、次のようになりました。

'A::A(A)' の呼び出しに一致する関数がありません。

コンパイラは代入操作を単に無視したようです。これから私を助けてくれますか?

4

3 に答える 3

3

これをコンパイルするには、コピー コンストラクターがそのパラメーターをconst参照で受け取る必要があります。

A(const A&){}

constコンストラクターの署名に追加すると、この問題が修正されます ( demo on ideone )。

代入演算子とコピー コンストラクターを定義しているため、デストラクターを追加することを強く検討する必要があります( 3 つのルールを~A()参照)。

于 2013-07-11T14:47:28.323 に答える
3

ここでは代入演算子は使用しません。

A a = makeA();

この行は初期化です。コピー コンストラクターを使用して、 によって返された値を にコピーしmakeAますaA::A(A&)一時的に使用できないため、コンパイラは不平を言っています。より一般的な形式に変更するとA(const A&)、状況が大幅に改善されます。

于 2013-07-11T14:50:04.730 に答える
0

@ピーターは正しいです。コピー コンストラクターは、代わりA(A&){}に になりたいと考えていますA(const A&){}。その理由は、コピーコンストラクターに渡されたものA(A&){}を変更する準備をするようにコンパイラーに指示するためです。これは実際には意味がなく、渡すものが一時的なAものである場合には確かに意味がありません。A

于 2013-07-11T14:57:46.780 に答える