문제

C ++에서는 소유자를 다시 가리키고 자하는 객체에 대한 참조가 있지만, 포함 된 클래스 구성 중에는 구조가 완료되지 않았기 때문에 포인터를 설정할 수 없습니다. 그래서 나는 다음과 같은 일을하려고 노력하고 있습니다.

class A {
   public:

     A() : b(this) {}
   private:
     B b;
};

class B {
   public:
     B(A* _a) : a(_a) {}
   private:
     A* a;
};

B에 대한 포인터를 잡지 않고 B가 A*로 항상 초기화되도록하는 방법이 있습니까?

감사

도움이 되었습니까?

해결책

이 시도:

class A;

class B {
public:
  B(A *_a) : a(_a) {};

private:
  A* a;
};

class A {
public:
  A() : b(this) {};

private:
  B b;

};

B는 A에 완전히 포함되어 있으므로 먼저 선언해야합니다. A에 대한 포인터가 필요하므로 B를 선언하기 전에 전진해야합니다.

이 코드는 더 많은 현재 버전의 G ++에서 컴파일됩니다.

다른 팁

C ++에서는 소유자를 다시 가리키고 자하는 객체에 대한 참조가 있지만, 포함 된 클래스 구성 중에는 구조가 완료되지 않았기 때문에 포인터를 설정할 수 없습니다.

포인터를 잘 저장할 수 있습니다.

당신이 할 수없는 것은 부모 인스턴스가 시점에서 완전히 초기화되지 않을 수 있으므로 B 생성자의 포인터를 통해 A의 멤버/메소드에 도달하는 것입니다.

#include <iostream>

class Y;

class X
{
    Y* y;
public:
    X(Y* y);
};

class Y
{
    X x;
    int n;
public:
    Y(): x(this), n(42) {}
    int get_n() const { return n; }
};

X::X(Y* p): y(p)
{
    //Now this is illegal:
    //as it is, the n member has not been initialized yet for parent
    //and hence get_n will return garbage
    std::cout << p->get_n() << '\n';
}

int main()
{
    Y y;
}

당신이 y의 멤버들을 바꾸면, n이 먼저 초기화되면 X의 생성자는 42를 인쇄하지만 너무 의존하기에는 너무 깨지기 쉽습니다.

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