참조 멤버가있는 내부 클래스의 기본 할당 연산자
-
11-09-2019 - |
문제
나는 내가 이해하지 못하는 문제를 해결하고 여기에 누군가가 통찰력을 제공하기를 바랐다. 단순화 된 코드는 다음과 같습니다 (원본 코드는 사용자 정의 큐/큐-타이터 구현) :
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;
}
다른 팁
초기 가치가 주어진 후에는 참조를 변경할 수 없습니다. 이것은 참조 멤버의 값을 변경하는 할당 연산자를 작성하는 것이 불가능하다는 것을 의미합니다. 이 작업을 수행 해야하는 경우 참조 대신 포인터를 사용하십시오.
실제로, 이것에 대한 해결책이 있습니다. 당신은 할 수 있습니다 구현 연산자 = 사본 구성 측면에서, 그리고 그것은 작동합니다 :) 그러한 경우에는 매우 유능한 기술입니다. 과제를 지원하고 싶다고 가정합니다.
C ++에는 "내부 클래스"가 없으며 중첩 된 클래스 선언이 없습니다. "내부 클래스"는 다른 주류 언어에서 발견되지 않는 자바주의입니다. Java에서 내부 클래스는 포함 유형의 객체에 대한 암묵적 불변의 참조를 포함하기 때문에 특별합니다. Java에서 C ++의 중첩 선언과 동등한 것을 달성하려면 정적 내부 클래스를 사용해야합니다. 정적 내부 클래스에는 선언 유형의 객체에 대한 참조가 포함되어 있지 않습니다.