[英]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.