2012-12-03 29 views
0

我正在寫一個序列化和反序列化的方法,並且我在執行deserialize時遇到了一個問題:我不能new a value_type,實際上它是Skill*如何新增value_type指針?

template <class T > 
static istream &DeSerializePVector(istream& istream_, T& container) 
{ 
    typedef typename T::value_type ElementType; 
    size_t size; 
    istream_ >> size; 
    container.reserve(size); 
    container.resize(size); 

    for(typename T::iterator ite = container.begin(); ite != container.end(); ite++) 
    { 
    *ite = new *ElementType; //how can I initialize this type? 
    (*ite)->DeSerialize(istream_); 
    } 

    return istream_; 
} 

int main() 
{ 
    Skill* disease = Factory::CreateSkill (SKILLTYPE_DISEASE); 
    Skill* purify = Factory::CreateSkill (SKILLTYPE_PURIFY); 
    Skill* skills[2] = {disease, purify}; 
    vector<Skill*> int_vector = Tools::MakeVector (skills); 
    ofstream fileOut; 
    fileOut.open ("data.txt", std::ofstream::binary); 

    ISerializable::SerializePVector(fileOut, int_vector); 
    fileOut.flush(); 
    fileOut.close(); 

    ifstream fileIn; 
    vector<Skill*> int_vector2; 
    fileIn.open ("data.txt", std::ofstream::binary); 
    ISerializable::DeSerializePVector(fileIn, int_vector2); 
} 

我該如何獲得這項工作?

+0

正確的語法是'new ElementType'(沒有「new」和「ElementType」之間的星號)。這是問題嗎?或者你問如何決定使用哪個構造函數? '新的ElementType'意味着你調用默認的構造函數。 – jogojapan

+0

據我可以告訴代碼,你已經分配了這些對象。 * ite無論是疾病還是淨化。在這種情況下,您根本不需要'* ite = new ElementType'這一行,只需調用DeSerialize即可,我認爲這實際上是用數據填充這些對象。 – combinatorial

+0

我不能新的技能* ..如果一個技能放在向量中,那麼你是對的。 –

回答

1

假設ElementType有一個默認的構造函數,然後

*ite = new ElementType; 

ElementType已經是一個指針類型,那麼你可能需要這個(C++ 11):

#include <type_traits> 

*ite = new typename std::remove_pointer<ElementType>::type; 

如果你不」沒有C++ 11支持,您可以使用boost等價物。

+0

但是type_value是SKill *,它是一個點。我不能新的技能*。 –

+0

@ZK_爲什麼你不能'新技能*' – user93353

+0

@ZK_ so'ElemenType' ='技能*'? – juanchopanza