2012-08-16 40 views
1

我有從具有虛擬功能的Base類繼承的派生類。我使用智能指針(shared_ptr)爲了創建對象,因爲我想把對象添加到一個向量中。但我注意到我的代碼重複處理對象來完成某些任務,所以我認爲模板可能是解決方案來改進我的代碼。 這是我嘗試到目前爲止(沒有確切的代碼,簡化):C++一個類(不是對象)一個模板的參數

class Base{ 

    public: 
    virtual ~Base(){} 
    virtual void display_message() = 0; 
}; 

class DerivedA : public Base{ 
    DerivedA(){} 
}; 

class DerivedB : public Base{ 
    DerivedB(){} 
}; 



//THE template- 
//<hold the smart pointer that points to different derived objects> 

template<typename T1> 

class HandleInstances{ 
     private:    

     vector<T1> ObjectVector; 
     //the iterator 

     T1 sp_base; 

     public: 

     HandleInstance(const T1 & sp){ 
      sp_base = sp; // set smart pointer 
     } 
     //somefunctions 

     //this is what i need to figure out 
     void AddToVector(){ 
      ObjectVector.push_back(sp_base(new 'The derived class')); 
     } 



}; 

的AddToVector功能是這裏的問題。爲了添加一個對象的元素,我必須做這個push_back(「智能指針」(新的「類」));.我如何讓模板接受類(不是對象)並將其實現爲push_back()的函數?

+0

可否請你展示瞭如何使用你的類的實例 – 2012-08-16 21:18:52

+0

好所有IM真正想要做的是分配?通用數據類型的函數push_back()。但我不知道如何使模板做到這一點。 – starhacker 2012-08-16 21:40:59

回答

0

這是一個具有挑戰性的 - 爲什麼?由於模板通過基於模板參數動態構造類的變體,在C++中作爲一種預處理步驟運行。

換言之,shared_ptr<DerivedA>shared_ptr<DerivedB>具有彼此任何沒有關係,因爲在C++中,模版基本上使它們像2點獨立的類聲明 - 無關的類型。

它們包含的指針都是基類的後代,但shared_ptrs本身也可能是Vector<Bool>Foo。從一個基類繼承DerivedADerivedB並不重要,它們的模板生成的類不會。

話雖這麼說,你有一定的靈活性:如果你把一個工廠函數類中的接口,這樣的:

class DerivedA : public Base{ 
    public: 
    static shared_ptr<DerivedA> construct{ 
     return shared_ptr<DerivedA>(new DerivedA()); 
    }; 
}; 

....similar for DerivedB 

那麼你可以做這樣的事情:

template<typename T> 
class HandleInstances{ 
    private:    

    vector<shared_ptr<T> > ObjectVector; 

    public: 

    //this is what i need to figure out 
    void AddToVector(){ 
     ObjectVector.push_back(T::construct()); 
    } 
}; 

,你應該沒問題。你正在做的是給每個類一個函數來彌補這個事實,即類本身不能被存儲以便以後創建對象。注意:

  1. HandleInstances中的模板參數是基本類型,而不是shared_ptr類型。
  2. Construct正在返回DerivedA和DerivedB中的不同類型。
  3. Base沒有聲明construct - 因爲這些函數不返回兼容類型,所以它們不是從Base繼承的。
  4. 你仍然不能在你的ObjectVector中混合和匹配類型,如果這是你所希望的 - 但是你永遠無法做到這一點。 (獎勵:如果你使用更多類型來包裝類型和處理這個問題有可能:看到boost::any
0

使函數模板,以及:

template<typename T2> 
void AddToVector(){ 
    ObjectVector.push_back(smart(new T2)); 
} 

我假設你的意思是有比你的成員變量sp_basepush_back RETHER智能指針。

1

你正在嘗試使用一個對象作爲一個類,並且這不起作用(除非對象有一個返回正確對象的operator(),但我離題了)。

嘗試,而不是:

void AddToVector(){ 
    ObjectVector.push_back(T1(sp_base)); 
} 

這將創建一個新的對象,並調用新對象的拷貝構造函數和傳遞sp_base它。所以本質上是創建一個sp_base的副本。

+1

事情是這樣的 - >「持有智能指針,指向不同的派生對象」,所以這將切片派生的對象。認爲他的意思是有一個智能指針類型而不是'sp_base'。 – 2012-08-16 21:17:01

相關問題