2016-11-23 12 views
0

我正試圖將多種類型推入相同的std::vector。例如,讓我們說我想推class type1class type2成一個向量。使用struct來推送std :: vector中的多個類型有什麼問題?

所以基本上我也能夠做到:

vec.push_back(new type1, new type2); 
vec.push_back(new type1, new type2); 

我心目中是使他們的父類類型繼承(但我沒有這樣做同一類型的Type1和Type2奢侈品現在)。因此我使用struct。所以我所做的就是

struct type{ 
    type1* t1; 
    type2* t2; 
}; 
std::vector<type> vec; 
vec.push_back({new type1, new type2}); 

你覺得使用struct來,這是一個好主意,或者我應該使用this後是在暗示該技術?關於那篇文章,我的另一個問題是爲什麼使這個複雜,而不是像我這樣使用struct

編輯:另一種方法是使用也std::vector<std::pair <type1, type2>>但因爲我可能有3型也因此這仍然不會爲我工作。

編輯type1type2,我說的是pointtriangle

編輯回答Martin在評論部分:我現在打算使用tuple with combining with enum看到this更多細節。

+0

由於您將同質類型的對象推入向量,它應該「有效」。但是,如果有更好的方法,很大程度上取決於個案的情況。你能否提供一些關於這個場景的更多信息,關於那些打包到那個結構中的兩個不同對象究竟是什麼? –

+2

*我想到的是通過使它們從父類類型繼承來使類型1和類型2相同(但現在我沒有這種奢侈)。如果我們忽略了一些選項,尤其是那些爲這種情況準確設置的基本選項(多態性),我們就不能談論一個*好的方法。 –

+0

使用原始指針和'new'操作符會使程序可能遭受內存泄漏。對於像點和三角形這樣的簡單對象,最好是按值存儲對象(例如,std :: vector ,其中shape是可以表示點或三角形的對象),但是如果您絕對必須動態分配對象,然後至少用std :: unique_ptr或std :: shared_ptr來保存它們,這樣你就不會泄漏它們。 –

回答

1

在評論具體的答案:then you could template it to the types using std::tuple instead of std::pair, as std::vector<std::tuple<type1, type2,.. typen>> m_types


這是一個好主意,但是你是不是從獲利的多態性。我知道你不能改變Type1和Type2類,但是你可以用他們周圍一類適合您需要:

(未測試)

class TypeWrap 
{ 
public: 
    virtual void execute() = 0; 
}; 

class Type1Wrap : public TypeWrap 
{ 
private: 
    Type1 m_type; 
public: 
    void execute(){ m_type.execute(); } 
}; 

class Type2Wrap : public TypeWrap 
{ 
private: 
    Type2 m_type; 
public: 
    void execute(){ m_type.execute(); } 
}; 

然後用vector<TypeWrap*> m_types這將使你打電話m_types[0]->execute();如果您需要動態分配,或者只是使用Type1Wrap type; m_types.push_back(&type);來獲取指向對象的指針,其他選項(如unique_ptr或shared_ptr)會更好,如果您需要動態分配,或者僅使用Type1Wrap type; m_types.push_back(&type); ,但一定要保持對象活着!

+0

我實際上想把這兩種類型放在一起:'m_types.push_back(type1,type2);' – solti

+1

你是指一對嗎?鑑於您的評論'另一種方式也是使用std ::向量<性病::對>但因爲我可能有3型也因此這仍然不會爲你想要的東西,像m_types.push_back me.'工作(type1,type2,...,type n)對不對?同一個向量中的類型數量總是相同的?或者它是否從一個push_back變爲另一個? – Hennio

+0

對於一個特定的向量可以說m_types採用三種不同類型的四個參數'm_types.push_back(type1,type2,type3,type3);' – solti

相關問題