如何使用for-each循环来美化析构函数
How can I use a for-each loop to beautify a destructor?
如果问题有点模糊,让我们使用示例类Paper
。
假设我有一个动态分配的指针数组:
Paper** myFolder;
之后,在某个地方,它被n个指针填满了:
myFolder = new Paper* [n];
//trimmed - make each pointer in myFolder point to something
当我们完成myFolder
时,我们需要在删除Paper**
之前删除每个Paper
:
for(int i = 0; i < n; i++)
delete myfolder[i];
我的问题:这段代码现在不是很"漂亮",因为c++ 11和更高版本的每个循环都有。我如何删除一个动态分配的指针数组与"for-each"语法工作?下面显然是语法错误的:
for(Paper* p: myFolder)
delete p;
或者
for each (Paper* p in myFolder)
delete p;
附加信息: myFolder
不是数组的数组。它是一个指针数组。为什么?因为我们的目标是利用多态性。Paper
可以被子类化,因此myFolder
是指针数组而不是对象数组。
当然,std::vector
是比使用原始指针更好的方法。这个问题是理论性的,只涉及新的c++语法。我不是在寻找关于如何重做这段代码的建议
您可以使用std::for_each
与一些指针运算。
std::for_each(myFolder, myFolder + n, [](Paper* p){ delete[] p; })
然而,在使用现代c++的精神中,我完全不鼓励使用手动内存操作,而是使用RAII
std::vector<std::vector<Paper>>
由于需要多态性,因此需要保存指向对象的指针。当前使用的指针指向动态分配的数组
纸* * myFolder;
不需要手动控制数组的分配,您可以轻松地使用
std::vector<Paper*> myFolder;
销毁文件夹时,优美地:
for(auto paper : myFolder)
delete paper;
应该避免使用原始指针。
下面是一个使用std::vector
来解决问题的例子。
#include <vector>
class Paper {
};
class Folder {
// A folder contains a vector of papers.
std::vector<Paper> m_papers;
public:
// Method to add a paper to the folder. Use Move semantics for performance.
void AddPaper(Paper && aPaper) {
m_papers.push_back(std::move(aPaper));
}
// A read-only getter.
const std::vector<Paper> & Papers() const { return m_papers; }
};
int main()
{
std::vector<Folder> folders; // All your folders.
Folder aFolder; // Create a folder.
aFolder.AddPaper(Paper()); // Add paper to the folder.
folders.push_back(aFolder); // Add a folder.
for (const auto & f : folders) {
for (const auto & p : f.Papers()) {
// Read each paper here.
}
}
}
当使用std::vector
时,可以使用范围for循环访问每个元素:
for (const auto & f : folders)
相关文章:
- 什么时候调用组成单元对象的析构函数
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 内联映射初始化的动态atexit析构函数崩溃
- 什么时候调用析构函数
- 优先顺序:智能指针和类析构函数
- C++-明确何时以及如何调用析构函数
- 使用基类指针创建对象时,缺少派生类析构函数
- 在c++中使用向量时,如何调用构造函数和析构函数
- 重载运算符new[]的行为取决于析构函数
- 我需要知道编译器如何在cpp中使用析构函数
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- 析构函数调用
- 循环中本地对象的析构函数是否保证在下一次迭代之前被调用?
- 递归导致程序崩溃,但 while 循环中的相同概念不是来自C++析构函数
- 如何在 exec 循环停止后正确使用 QSharedPointer 的析构函数<QObject>?
- C++ - 如果在循环中声明对象,是否在循环结束时调用其析构函数
- 在具有静态对象的类的析构函数中使用 exit(),不会像预期的那样结束无限循环
- 删除第一次循环时未调用析构函数的保留字
- 如何使用for-each循环来美化析构函数
- 循环数据依赖关系析构函数