C++ 如何创建新的值\类型指针?
我正在编写一个序列化和反序列化方法,在实现C++ 如何创建新的值\类型指针?,c++,C++,我正在编写一个序列化和反序列化方法,在实现反序列化时遇到了一个问题:我不能新建一个值类型,这实际上是一项技能* template <class T > static istream &DeSerializePVector(istream& istream_, T& container) { typedef typename T::value_type ElementType; size_t size; istream_ >> size;
反序列化
时遇到了一个问题:我不能新建
一个值类型
,这实际上是一项技能*
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 );
}
模板
静态istream和反序列化pVector(istream和istream、T和容器)
{
typedef typename T::value_type ElementType;
大小;
i流大小;
集装箱.储备(尺寸);
容器。调整大小(大小);
对于(typename T::iterator ite=container.begin();ite!=container.end();ite++)
{
*ite=new*ElementType;//如何初始化此类型?
(*ite)->反序列化(istream_u3;);
}
返回流;
}
int main()
{
技能*疾病=工厂::CreateSkill(SKILLTYPE_疾病);
Skill*purify=Factory::CreateSkill(SKILLTYPE_purify);
技能*技能[2]={疾病,净化};
向量int_vector=Tools::MakeVector(技能);
流文件输出;
fileOut.open(“data.txt”,std::ofstream::binary);
ISerializable::SerializePVector(文件输出,int_向量);
flush();
fileOut.close();
ifstreamfilein;
向量int_向量2;
fileIn.open(“data.txt”,std::ofstream::binary);
ISerializable::反序列化pVector(fileIn,int_vector2);
}
我该如何完成这项工作呢?假设
ElementType
有一个默认构造函数,那么
*ite = new ElementType;
它ElementType
已经是指针类型,那么您可能需要它(C++11):
#包括
*ite=新类型名称std::remove_pointer::type;
如果您没有C++11支持,可以使用与之相当的
boost
。正确的语法应该是newelementtype代码>(在“new”和“ElementType”之间没有星号)。这就是问题所在吗?或者你在问如何决定使用哪个构造函数newelementtype
表示调用默认构造函数。从代码中可以看出,您已经分配了这些对象*它不是疾病就是净化。在这种情况下,您根本不需要行“*ite=new ElementType”,只需通过调用反序列化,我认为这将实际用数据填充这些对象。我无法使用“新技能*”。。如果将技能放在向量中,那么您是对的。当我调整向量大小时,实际上没有可调用的默认构造:),但类型值是Skill*,这是一个点。我不能使用新技能*@ZK_u。为什么你不能new Skill*
@ZK_u。所以ElementType
=Skill*
?Xcode抱怨说“将不兼容的类型“ElementType”(又名“Skill*”)分配给“Skill*”;取消对*
#include <type_traits>
*ite = new typename std::remove_pointer<ElementType>::type;