Проблема с вложенностью класса QFile

Проблема возникает, когда я определяю структуру, подобную следующей

struct TInputData
{
QString      filename;
QFile        file;
QTextStream  stream;
};

затем я помещаю это в контейнер QVector следующим образом:

QVector<struct TInputData> input(DATA_SOURCE_END);

после этого я вызываю некоторые методы полей-членов вектора:

for(int i = 0; i < DATA_SOURCE_END; ++i)
{
input[i].filename = QString(argv[i + 1]);
input[i].file.setFileName(input[i].filename);
if (!input[i].file.open(QIODevice::ReadOnly))
{
QDebug(QtCriticalMsg) << "Failed to open input file: " << input[i].filename << "!!!";
return a.exec();
}
input[i].stream.setDevice(&input[i].file);
qDebug() << "Connected to input file " << input[i].filename;
}

Я получаю следующую ошибку компиляции:

/usr/include/qt4/QtCore/qfile.h:209: error: 'QFile::QFile(const QFile&)' is private
within this context <at line where struct TInputData is declared>

И точно так же в отношении QTextStream.

Так чего мне не хватает?

Заранее спасибо за помощь.

ОБНОВИТЬ

Решение, предлагаемое @Ashot, заключается в создании объектов TInputData вручную. Но это вводит некоторые дополнительные трудности управления памятью. Обходной путь — использование умных указателей.

1

Решение

+ Изменить QVector<struct TInputData> input(DATA_SOURCE_END); в QVector<TInputData*> input(DATA_SOURCE_END);

QVector нужно копировать его содержимое, но копировать конструктор QFile является частным, его нельзя скопировать.

При использовании указателей вы должны вручную создавать новые и удалять объекты TInputData или использовать для этого умные указатели.

Ты можешь попробовать QSharedPointer http://qt-project.org/doc/qt-4.8/qsharedpointer.html#QSharedPointer-2.
Ваш вектор будет QVector<QSharedPointer<TInputData> > input(DATA_SOURCE_END)

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]