簡體   English   中英

內部類中的默認賦值運算符,帶有引用成員

[英]Default assignment operator in inner class with reference members

我遇到了一個我不明白的問題,我希望這里有人可以提供一些見解。 簡化代碼如下(原始代碼是自定義隊列/隊列迭代器實現):

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變量解決這個問題,因為它們應該是獨立的'C'對象,但這只能隱藏問題(我仍然不明白為什么我不能這樣做)。

我認為原因是參考不能被復制,但我不明白為什么。 我是否需要提供自己的賦值運算符和復制構造函數?

這個問題與內部類無關。 在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;
}

給定初始值后,無法更改引用。 這意味着無法編寫更改引用成員值的賦值運算符。 如果需要這樣做,請使用指針而不是引用。

實際上,有一個解決方案。 您可以在復制構造方面實現operator =,它將起作用:)對於這種情況,它是一種非常強大的技術。 假設你確實想支持任務。

C ++沒有“內部類”,只有嵌套的類聲明。 “內部類”是我認為在其他主流語言中找不到的Java主義。 在Java中,內部類是特殊的,因為它們包含對包含類型的對象的隱式不可變引用。 要在Java中實現等效於C ++的嵌套聲明,需要使用靜態內部類; 靜態內部類不包含對聲明類型的對象的引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM