C ++ 구성중인 물체를 참조합니다
-
12-09-2019 - |
문제
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를 인쇄하지만 너무 의존하기에는 너무 깨지기 쉽습니다.
제휴하지 않습니다 StackOverflow