2012-02-26 3 views
1

아마도 나는 아무것도 걱정하지 않습니다. RAII 관용구를 밀접하게 따르는 데이터 멤버가 필요합니다. 추상 기본 클래스의 보호 된 포인터 멤버를 null로 초기화하려면 어떻게해야합니까?추상 기본 클래스의 보호 된 멤버를 어떻게 초기화합니까?

나는 그것이 null이되어야한다는 것을 알고 있지만 그것이 보편적으로 이해되도록하는 것이 더 좋지 않겠는가?

초기화 코드를 초기화 프로그램 목록에 넣지 않으면 실행되지 않을 수 있습니다. 이 포인터를 스택에 할당하는 어셈블리 연산을 생각하면 멀티 스레딩 환경에서와 같이 (c'tor 본문처럼) 중단되거나 스택 확장이 원자 적으로 보장 될 수 있습니까? 소멸자가 실행되도록 보장된다면 프로세서가 원자 적으로 수행하지 않더라도 스택 확장은 그러한 보장을 보장하지 않을 수 있습니까?

어떻게 그런 간단한 질문이 그렇게 광범위하게 되었습니까? 감사.

std :: library를 피할 수 있다면 나는 아주 작은 환경에 있습니다.

답변

3

아마도 당신이 지나치게 생각에 삭제하는 것입니다.

struct Base 
{ 
    virtual ~Base() = 0; // or make something else pure; this is just an example 

    Base() : p() { }   // p initialized to null 
    Base(Foo * q) : p(q) { } // another option 

protected: 
    Foo * p; 
}; 

struct Derived : private Base 
{ 
    // no extra work needed 

    // maybe something like this... 
    Derived(int a, bool c) : Base(new Foo(a * (c ? 2 : 3))) { } 
}; 

파생 생성자는 기본 생성자 제일 먼저 호출하고, 차례로 하나가 Base::p가 0으로 초기화됩니다 말한다 : 다음 예는 null로 intialized베이스 부재있다.

+0

이상하게 생각하면, lol ++ – John

+0

너무 많은'if (p) delete p;'마법사가 아마도 코드를 생성 했나요? – John

+0

@ 존 : 좀 더 사소한 예제를 추가했습니다. 'delete'는베이스 소멸자에서'Base :: ~ Base() {delete p; }'. (사실,'if '라고 말하지 마십시오.) –

3

매우 쉽게 : 가장 좋은 방법은 스마트 포인터를 사용하는 것입니다. 실제로 표준을 피하지 마십시오. 일반적인 방법보다 일반적으로 일을합니다.

class base{ 
public: 
    base() : a(new int(5)) {} 
protected: 
    std::unique_ptr<int> a; 
    virtual ~base() {} 
}; 

class child : public base { 
    child() : base() {} 
    ~child() {} //a will automatically be deleted 
}; 

이 경우 포인터가 자식에 의해 사용되지 않는 경우 (종종 훌륭한 디자인이 아님), 개인화 될 수 있습니다.

또 다른 방법은 수동으로 기본 소멸자

class base{ 
public: 
    base() : a(new int(5)) { } //base member init'd 
protected: 
    int* a; 
    virtual ~base() { delete a; } //base member destroyed 
}; 
+0

다른 아이디어? 나는 std :: library를 사용할 수 없다. 내 추상 기본 클래스에서 c'tor을 가질 수 있는지 전혀 몰랐습니다. – John

+0

예 낮은 개념의 추상 클래스는 생성자와 소멸자를 가질 수 있습니다. 그것은 당신의 문제를 해결할 것입니다. 관심사에서 당신은 std lib가 왜 없는가, 무슨 표적/컴파일러? – 111111

+0

@ 존 : 궁금 해서요, 임베디드 시스템 용 코드를 작성하고 있습니까? 환경이 최소 인 이유는 무엇입니까? –

관련 문제