2014-03-26 104 views
0

我對C++的OO方面比較陌生,所以請原諒這個問題,我想它是相對直接的;C++對象指針和範圍

我有一些代碼,鬆散這樣

SuperClass* super; 

if (useSub1()) 
{ 
    SubClass1 sub1 (s); 

    super = &sub1; 
} 
else if (useSub2()) 
{ 
    SubClass2 sub2 (s); 

    super = &sub2; 
} 

super.someMethod(); 

應當注意,這裏的一點是,「子」的建設取決於調用someFunction的結果()。 此外,將會有多個if(...){}構造像上面那樣,每個構造都基於一些條件基於不同的SuperClass子類創建不同的Object。

總之,SuperClass有許多子類,我想根據if條件創建適當的對象類型,然後使用'super'對象來操作它們。

這是我的問題,我認爲通過做什麼我有sub1(或sub2的事情)將超出範圍,所以這使我留下一個指向什麼都沒有?

我希望能夠合理地清楚我想要做什麼,我只是不確定如何正確編寫它。任何幫助或建議感激地收到。

感謝預期

+1

是的,它留下了一個糟糕的指針。這將是未定義的行爲。如果你想要的內存超過了它創建的範圍,你將不得不使用新的。 – Ben

回答

1

由於@Ben表明:使用新

SuperClass* super; 

if (useSub1()) { 
    super = new SubClass1(s); 
} 
else if (useSub2()) { 
    super =new SubClass2(s) 
} 

super->someMethod(); 
+0

如果'useSub1()'和'useSub2()'返回'false',那麼該怎麼辦? – triclosan

+0

呃......對不起。我只是遵循原始問題中的相同結構。 – jsantander

+0

感謝您的回答,它確實完美地工作。我一直拒絕使用新的,因爲這需要一些家務來刪除它。雖然在這種情況下,這似乎是最好的方法。 繼續關於如果if中的條件失敗,沒有「全部收集」的評論。這只是我想要做的鬆散,我接受這需要在實際代碼中尋址。 再次感謝 – Nerdio

2

閱讀有關創建型模式,根據你的問題的信息:工廠或工廠方法可能會滿足您的需求。

該設計模式允許在堆中動態創建對象,並且可以使用指向基類的創建對象進行操作。

爲了防止內存泄漏,妥善處理資源,我建議你使用智能指針std::unique_ptr<Type>boost::shared_ptr<Type>
如果你打算使用std :: auto_ptr的不與容器

+1

不要使用std :: auto_ptr,而是使用std :: unique_ptr。 –

+0

@const_ref爲什麼? –

+0

@const_ref哦,是的,當然可以,謝謝。無論如何,熟悉智能指針概念作爲資源管理的好工具是非常有用的 –

0

使用它是,sub1和sub2對象dtors將在超出範圍時被調用,並且'super'指針將指向一個處於不確定狀態棧中的對象。在某些情況下,它可能仍然在有效的內存區域,因此不會導致段違例,導致一個微妙的錯誤。

它也像你需要的東西像一個「抽象工廠」設計模式:

http://en.wikipedia.org/wiki/Abstract_factory_pattern

0

你可以使用一個工廠方法:

std::unique_ptr<SuperClass> create(const std::string& name) 
{ 
    if (name == "Sub1") 
     return std::unique_ptr<SubClass1>{new SubClass1}; 

    if (name == "Sub2") 
     return std::unique_ptr<SubClass2>{new SubClass2}; 

    throw std::runtime_error; 
} 

在這裏,我使用的std::string選擇要創建的對象的類型,但它可能是enum

請注意,std::unique_ptr本身管理對象的生命週期,所以不需要delete任何東西。

void foo() 
{ 
    auto object = create("SubClass1"); 
    object->bar(); 
} <-- object is deleted automatically