7

理解できない問題に遭遇しました。誰かが洞察を提供してくれることを期待していました。簡略化されたコードは次のとおりです (元のコードはカスタム キュー/キュー イテレータの実装でした)。

class B
{
public:
    B() {};
    class C
    {
    public:
        int get();
        C(B&b) : b(b){};
    private:
        B& b;
    };
public:
    C get_c() { return C(*this); }
};

int main()
{
    B b;
    B::C c = b.get_c();


    c = b.get_c();
    return EXIT_SUCCESS;
}

これをコンパイルすると、次のエラーが表示されます。

foo.cpp: In member function 'B::C& B::C::operator=(const B::C&)':
foo.cpp:46: error: non-static reference member 'B& B::C::b', can't use default assignment operator
foo.cpp: In function 'int main()':
foo.cpp:63: note: synthesized method 'B::C& B::C::operator=(const B::C&)' first required here

独立した「C」オブジェクトであると想定されているため、2つの個別のC変数を使用してこれを回避できますが、これは問題を隠すだけです(なぜこれができないのかまだわかりません)。

理由は参照をコピーできないためだと思いますが、理由がわかりません。独自の代入演算子とコピー コンストラクターを提供する必要がありますか?

4

4 に答える 4

13

この問題は、内部クラスとは関係ありません。C++ では、参照を (再) 割り当てすることはできません。定義時に初期化する必要があります。

より簡単な例は次のとおりです。

class B
{
public:
    B(int& i) : ir(i) {};

    int& ir;
};


int main()
{
    int i;
    B b(i);      // Constructor - OK

    int j;
    B bb = B(j); // Copy constructor - OK

    bb = b;      // Assignment - Error
    return 0;
}
于 2009-12-02T13:04:24.843 に答える
6

参照は、初期値が与えられた後は変更できません。これは、参照メンバーの値を変更する代入演算子を記述できないことを意味します。これを行う必要がある場合は、参照の代わりにポインターを使用してください。

于 2009-12-02T13:01:32.867 に答える
3

実は、これには解決策があります。コピー構築に関して operator= を実装することができ、それは機能します:) そのような場合には非常に有能なテクニックです。割り当てをサポートしたいと仮定します。

于 2009-12-02T20:54:33.030 に答える
0

C++ には「内部クラス」はなく、ネストされたクラス宣言だけです。「内部クラス」は Java 主義であり、他の主流言語には見られないと思います。Java では、内部クラスは特別です。内部クラスには、包含型のオブジェクトへの暗黙の不変参照が含まれているからです。Java で C++ のネストされた宣言と同等のものを実現するには、静的内部クラスを使用する必要があります。static 内部クラスには、宣言型のオブジェクトへの参照が含まれていません。

于 2009-12-02T18:36:15.670 に答える