2013-09-25 4 views
1

Проблема возникает, когда я определения структуры вроде следующего одногопроблема с 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.

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

Заранее за вашу помощь.

UPDATE

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

+1

Это означает, что объекты 'QFile' не могут быть скопированы, что, очевидно, затрудняет их перенос в вектор. Вы можете использовать указатели, если вы готовы управлять памятью. Самый простой ответ - какой-то умный указатель. – john

+0

спасибо, я постараюсь сыграть с указателем 'TInputData'. – niebelung

ответ

2

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

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

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

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

+0

большое спасибо! Не могли бы вы порекомендовать некоторую информацию (возможно, с примерами использования), чтобы прочитать о умных указателях? – niebelung

+0

Еще раз спасибо за обновление! – niebelung