1

我正在寻找一种在程序运行时动态创建新类对象的方法。到目前为止,我所阅读的内容让我相信这并不容易,并且通常保留用于更高级的程序要求。

到目前为止,我尝试过的是:

// 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) )
            }
        }
    }
}
4

4 回答 4

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;
}

当然,这不是例外安全的。

于 2012-11-14T03:55:24.173 回答
1
vector<classType> vect;

声明了包含 类型的向量容器classType,但是您正在添加a pointer to classType到 vect 中,这确实会使编译器不高兴。

如果您需要polymorphism在向量容器中显示对象,则需要存储指向对象的指针,将您的 vect 类型更改为:

vector<std::shared_ptr<classType> > vect;
于 2012-11-14T03:55:10.110 回答
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在某些时候使用您的对象。

于 2012-11-14T04:00:32.447 回答
0

声明动态对象使用以下格式:

TypeName * Name = new TypeName

你的向量有点快,你需要做的是创建一个对象类的新对象,然后将它推入向量。

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];
}

在此处更深入地阅读动态分配

于 2012-11-14T03:55:45.187 回答