문제

나는 내가 이해하지 못하는 문제를 해결하고 여기에 누군가가 통찰력을 제공하기를 바랐다. 단순화 된 코드는 다음과 같습니다 (원본 코드는 사용자 정의 큐/큐-타이터 구현) :

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 ++의 중첩 선언과 동등한 것을 달성하려면 정적 내부 클래스를 사용해야합니다. 정적 내부 클래스에는 선언 유형의 객체에 대한 참조가 포함되어 있지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top