2012-04-24 1 views
2

동일한 참조가 실제로 참조 될 수도 있고 실제로 참조되지 않을 수도있는 두 개의 참조를받는 부모 클래스가 있습니다.이니셜 라이저 목록의 시퀀스 포인트 경고

class A 
{ 
    public: 
    A(int) {} 
    private: 
    A() {} 
}; 

class Parent 
{ 
    public: 
    Parent(A&, A&) {} 
}; 

class Child : public Parent 
{ 
    public: 
    Child() : 
     Parent(
      *(_A = new A(0)), 
      *(_A)) //Warning on this line 
    { 
    } 

    private: 
    A *_A; 
}; 

int main(int argc, char** argv) 
{ 
    return 0; 
} 

나는 그 줄에 역 참조가 이후에 발생 보장되지 않기 때문에 그것의 추측하고있어 : 그들은 같은 경우이 경우, 내 자식 클래스의 초기화 목록에서 순서 포인트 경고가 메모리가 할당되었습니다. 어쨌든 내 질문은 부모님이나 A에게 변경하지 않고이 문제가 있습니까?

답변

4

부모 생성자에 대한 두 개의 인수가 호출되는 순서가 보장되지 않으므로 (순서 지점이 없음) 컴파일러는 *(_A = new A(0))을 평가하기 전에 *(_A)을 합법적으로 평가할 수 있습니다.

A을 동적으로 할당해야합니까? 그렇지 않으면 당신이 할 수 있습니다

class Child : public Parent 
{ 
    public: 
    Child() : Parent(_a, _a), _a(0) {} 
    private: 
    A _a;    // _A is reserved for the implementation (compiler + library) 
}; 

하나주의해야 할 점으로는 회원의 주소를 획득하거나 제공에 대한 참조를 취할 유효하지만, 그것은 _a 전에 참조 또는 포인터 사용에 정의되지 않은 동작입니다 구성원이 초기화되면 Parent 생성자가 완료된 후에 만 ​​발생합니다. 즉, Parent의 생성자는 참조 만 저장하지만 안전하지 않은 객체는 사용하지 않습니다 (블레이드의 가장자리를 따라 타고 있지만 출혈은 없습니다). Parent 생성자가 저장 이외의 기준을 사용

경우에, 당신은 이미 구축 A 객체에 대한 포인터를받을 수 Child 클래스를 변경할 수 있습니다

Child::Child(A* a) : Parent(*a, *a), _a(a) {}