Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何创建新的值\类型指针?_C++ - Fatal编程技术网

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;