2012-06-03 84 views
3

我想知道在我的類的構造函數中初始化auto_ptr成員的正確方法。 我的班級有2個(或更多)不同類型的auto_ptr實例。其中一個的初始化取決於第一個初始化的結果。auto_ptr構造函數體中的成員初始化(不在初始化程序列表中)

爲了澄清,這是我在做什麼:

class C1 { 
... 
} 

class C2 { 
... 
} 

class Holder { 
private: 
    auto_ptr<C1> c1; 
    auto_ptr<C2> c2; 

public: 
    Holder() : 
    c1(new C1()), 
    c2(NULL) 
    { 
    int x = this->c1->getGeneratedValue1(); 
    int y = this->c1->getGeneratedValue2(); 

    if (x > 0 && y > 0) { 
     auto_ptr<C2> lC2(new C2(true, 10)); 
     this->c2 = lC2; 
    } else if (x > 0) { 
     auto_ptr<C2> lC2(new C2(false, 20)); 
     this->c2 = lC2; 
    } else if (y > 0) { 
     auto_ptr<C2> lC2(new C2(false, 30)); 
     this->c2 = lC2; 
    } else { 
     auto_ptr<C2> lC2(new C2(false, 0)); 
     this->c2 = lC2; 
    } 
    } 
}; 

的例子是有點重複,但該強制執行2個auto_ptr的實例之間的依賴關係。 我決定在構造函數體中創建一個本地auto_ptr,並在初始化它時將它的託管實例的所有權轉移給類成員。

這樣做的正確方法還是應該使用更好/更安全?

非常感謝。

回答

6

對於構造函數初始化程序列表內複雜的初始化規則,使用一個輔助功能:

class Holder { 
private: 
    std::unique_ptr<C1> c1; 
    std::unique_ptr<C2> c2; 

    static C2* c2_init_helper(/* const? */ C1& the_c1) 
    { 
    int const x = the_c1->getGeneratedValue1(); 
    int const y = the_c1->getGeneratedValue2(); 

    if (x > 0) { 
     if (y > 0) return new C2(true, 10); 
     return new C2(false, 20); 
    } 
    if (y > 0) return new C2(false, 30); 
    return new C2(false, 0); 
    } 

public: 
    Holder() : 
    c1(new C1()), 
    c2(c2_init_helper(*c1)) 
    { 
    } 
}; 

另外,std::unique_ptr(如果有一個C++ 11編譯器)或boost::scoped_ptr都是優選std::auto_ptrauto_ptr轉讓所有權複製語義被發現只是麻煩。

+0

我需要儘可能多地生成代碼。這是針對嵌入式設備的,我認爲大多數嵌入式編譯器都不兼容C++ 11。 我試圖避免內存泄漏,如果在構造函數內引發一些異常。 – Marcus

+2

@Marcus:然後,我仍然會看看Boost.Move並編寫自己的'unique_ptr',但*請*只是取消'auto_ptr'。 – Xeo

+0

我不認爲我可以使用C++ 11或Boost。 C++ 11在嵌入式系統中並不流行。 Boost可能也是一個問題。我認爲將圖書館集成到其他環境/平臺時可能會受到限制。 – Marcus

相關問題