我正在寻找一种在程序运行时动态创建新类对象的方法。到目前为止,我所阅读的内容让我相信它并不容易,而且通常会保留用于更高级的程序要求。
到目前为止我尝试过的是:
// create a vector of type class
vector<class_name> vect;
// and use push_back (method 1)
vect.push_back(*new Object);
//or use for loop and [] operator (method 2)
vect[i] = *new Object;
这些都没有从编译器抛出错误,但是我使用ifstream从文件中读取数据并动态创建对象...文件读取带来了一些奇怪的数据并偶尔读取一个内存地址,它是很明显,这是由于我使用/滥用上面的代码片段。
文件读取代码如下:
// in main
ifstream fileIn
fileIn.open( fileName.c_str() );
// passes to a separate function along w/ vector
loadObjects (fileIn, vect);
void loadObjects (ifstream& is, vector<class_name>& Object) {
int data1, data2, data3;
int count = 0;
string line;
if( is.good() ){
for (int i = 0; i < 4; i++) {
is >> data1 >> data2 >> data3;
if (data1 == 0) {
vect.push_back(*new Object(data2, data3) )
}
}
}
}
答案 0 :(得分:4)
vector<Object> vect;
vect.push_back(Object()); // or vect.emplace_back();
就是这样。这是正确的方式,期间。您从文件中读取对象时所描述的任何问题都是一个单独的问题,我们需要查看该代码以帮助您找出问题所在。
如果您需要多态性,请使用智能指针:
vector<unique_ptr<Base>> vect;
vect.emplace_back(new Derived);
如果由于某种原因限制使用智能指针,那么老式的,容易出错的方法就是这样:
vector<Base *> vect;
vect.push_back(new Derived);
....
for (int i=0; i<vect.size(); ++i)
{
delete vect[i];
vect[i] = NULL;
}
当然,这不是例外安全。
答案 1 :(得分:1)
vector<classType> vect;
声明包含classType
类型的向量容器,但是你要将a pointer to classType
添加到vect中,这会让编译器确实不满意。
如果需要在向量容器中显示对象的polymorphism
,则需要存储指向对象的指针,将vect类型更改为:
vector<std::shared_ptr<classType> > vect;
答案 2 :(得分:1)
如果您必须使用指针(您的对象在内部存储大型数据集),那么您应该将代码更改为:
// create a vector of type class
vector<class*> vect;
// and use push_back (method 1)
vect.push_back(new Object);
//or use for loop and [] operator (method 2)
vect[i] = new Object;
请注意,您必须在某个时刻delete
对象。
答案 3 :(得分:0)
声明动态对象使用以下格式:
TypeName * Name = new TypeName
你要用你的向量快速做一点,你需要做的是创建一个Object类的新对象,然后将它推入向量。
Object * MyObj = new Object //allocate space for new object
vect.push_back(MyObj) //push back new object
请记住删除分配的内容,这意味着循环遍历每个元素以删除其成员:
for(int i = 0; i < vectLen; i++) //probably will be replaced with iterators for vectors
{
delete vect[i];
}
更深入地了解动态分配here