gpt4 book ai didi

c++ - 如何构建 MyClass 的容器,MyClass 构造函数可以在其中抛出?

转载 作者:搜寻专家 更新时间:2023-10-31 01:23:09 25 4
gpt4 key购买 nike

我有这样的东西:

#include "MyImage.hpp"  // MyImage wraps the Qt library image class
namespace fs = boost::filesystem;
class ImageCollection {
public:
ImageCollection(const char* path);
private:
const fs::path path_;
deque<MyImage> instanceDeque_;
}

ImageCollection(const char* path) :
path_(fs::is_directory(path) ?
fs::complete(path) :
fs::complete(path).parent_path()) /* Can I even do this? */
{
/*** code in question ***/
fs::directory_iterator endIter;
for(fs::directory_iterator dirIter(path_); dirIter != endIter; dirIter++) {
instanceDeque_.push_back(MyImage(*dirIter));
}
}

当 *dirIter 是非图像文件的 fs::path 时,MyImage 构造函数抛出 MyInvalidFileException。

我希望 MyImage 和 ImageCollection 是不可变的。

我可以:

try {
instanceDeque_.push_back(MyImage(*dirIter));
}
catch(const MyInvalidFileException& e) { // oops, tnx Nemanja T.
// remember *dirIter in a list of non-Image files, to use later
continue;
}

抛出时会发生什么?双端队列中是否还有僵尸 MyImage 或僵尸元素?或者这实际上是正确的方法吗? (即 push_back() 被中止并且没有创建 MyImage。)

我目前有一个困惑的解决方法:

// load up an empty MyImage, which I'd rather not do
instanceDeque_.push_back(MyImage());
for(fs::directory_iterator dirIter(path_); dirIter != endIter; dirIter++) {
MyImage& attemptImage = instanceDeque_.back();
bool success = attemptImage.loadPath(*dirIter); // "fill" the empty MyImage
if (success)
instanceDeque_.push_back(MyImage()); // prepare another empty MyImage
}
instanceDeque_.pop_back(); // discard the empty MyImage

其中 MyImage 使用空 QImage* 初始化,而 loadPath() 在堆上创建 QImage。这迫使我到处进行空指针检查。我认为如果文件可以打开,应该有一种方法可以拥有 QImage 的实例,如果文件不能打开,构造就会失败。

最佳答案

我猜这取决于 MyImage。如果 MyImage 的构造函数中存在异常,它应该在您到达 push_back 方法之前失败。这是因为构造函数将在 push_back 之前运行(这是合乎逻辑的,因为它需要一个值来传递该方法)。因此,如果该步骤失败并抛出异常,则永远不会到达 push_back

这里有一些提示:

关于c++ - 如何构建 MyClass 的容器,MyClass 构造函数可以在其中抛出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1928808/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com