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

Best Methods for Dynamically Creating New Objects

本文关键字:最佳 方法 对象 创建 新对象 动态      更新时间:2023-10-16

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

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

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

当然,这不是例外。

如果您绝对必须使用指针(您的对象在内部存储大型数据集),那么您应该将代码更改为:

// 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对象。

vector<classType> vect;

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

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

vector<std::shared_ptr<classType> > vect;

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

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

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