动态创建新对象的最佳方法

时间:2012-11-14 03:51:10

标签: c++ vector dynamic-data

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

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

// 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 个答案:

答案 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