У меня есть что-то вроде:
#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));
}
}
Конструктор MyImage создает исключение MyInvalidFileException, когда * dirIter представляет собой путь fs :: к файлу, не являющемуся изображением.
Я бы хотел, чтобы 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, если файл может быть открыт, и конструкцию, которая просто не удастся, если файл не может.