动态创建新对象的最佳方法
Best Methods for Dynamically Creating New Objects
我正在寻找一种在程序运行时动态创建新类对象的方法。到目前为止,我所读到的内容使我相信这并不容易,通常保留给更高级的程序要求。
到目前为止,我尝试的是:
// 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];
}
在此处更深入地阅读动态分配
相关文章:
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 在C++中向零方向近似的最佳方法
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 检测win32服务创建和删除的最佳方法
- 在C++中样板"冷/never_inline"错误处理技术的最佳方法是什么?
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 将线程中的数据存储到全局容器的最佳方法?
- 将一系列整数放入类的最佳方法是什么?
- 在派生类中使用基类的私有成员变量的最佳方法
- 在 C++ 中将非指定类型作为参数传递的最佳方法?
- Qt - QVector 和模型视图 - 从列表视图获取自定义类的最佳方法是什么?
- 使用 Git 处理 C++ Visual Studio 2019 解决方案的外部依赖项源代码管理的最佳方法是什么?
- 比较两个节点坐标的最佳方法是什么?
- 在nodejs中使用本机代码的最佳方法是什么?
- 将 pybind11 绑定标记为已弃用的最佳方法
- C++:将向量传递到构造函数以创建成员变量的最佳方法?
- C++中变量混叠的最佳方法
- 读取大文件(>2GB)(文本文件包含以太网数据)并通过不同参数随机访问数据的最佳方法是什么?