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