Я создал класс Qt с именем video, например:
video.h
class Video : public QDjangoModel {
Q_OBJECT
// ...
public:
explicit Video(QObject *parent = 0);
// ...
};
video.cpp
Video::Video(QObject *parent) : QDjangoModel(parent) {}
и произошла следующая ошибка:
In file included from ../OnlineVideoPlayer/video.h:7:0,
from ../OnlineVideoPlayer/video.cpp:28: ../../../bin/QtSDK/Desktop/Qt/4.8.1/gcc/include/QtCore/qobject.h: In
copy constructor 'QDjangoModel::QDjangoModel(const QDjangoModel&)':
../../../bin/QtSDK/Desktop/Qt/4.8.1/gcc/include/QtCore/qobject.h:333:5:
error: 'QObject::QObject(const QObject&)' is private
/usr/local/include/qdjango/db/QDjangoModel.h:72:22: error: within this
context In file included from ../OnlineVideoPlayer/video.cpp:28:0:
../OnlineVideoPlayer/video.h: In copy constructor 'Video::Video(const
Video&)': ../OnlineVideoPlayer/video.h:14:7: note: synthesized method
'QDjangoModel::QDjangoModel(const QDjangoModel&)' first required here
Этот класс расширяет класс с именем QDjangoModel
(который включен в QDjango) а также QDjangoModel
продолжается QObject
,
Когда я создаю класс в Qt creator, он создает следующий шаблон:
NewClass::NewClass(QObject *parent) : QObject(parent) {}
и я думал : QObject(parent)
является конструктором родителя, поэтому я заменил его на : QDjangoModel(parent)
но это кажется неверным.
Вопросы:
Q1. Какие : QObject(parent)
имею в виду?
Я погуглил по поводу списка инициализации и понял смысл следующего кода:
class NewClass {
public:
FileReader(QString name);
private:
QString m_name;
};
NewClass::NewClass(QString name) : m_name(name) {}
В этом случае,
m_name = name;
выполняется при выполнении конструктора, верно?
Но в моем случае
NewClass::NewClass(QObject *parent) : QObject(parent) {}
или же
NewClass::NewClass(QObject *parent) : QDjangoModel(parent) {}
не имею в виду
QObject = parent;
или же
QDjangoModel = parent;
очевидно, поэтому мое понимание m_name(name)
дело не применяется для QObject(parent)
дело.
Q2. Что я могу исправить эту ошибку?
Поскольку вы не предоставляете конструктор копирования в своем коде, компилятор синтезирует его для вас.
Синтезированный компилятором конструктор копирования вызывает конструктор копирования базового класса.
Это как это реализовано (ну, синтезировано :)
) сюда:
Video::Video(const Video&) : QDjangoModel::QDjangoModel(const QDjangoModel&)
{ /* [...] */ }
Я думаю, что проблема в том, что в потоке вызовов, начиная с конструктора копирования, синтезированного компилятором, есть вызов QObject::QObject(const QObject&)
который является частным.
Qt не хочет, чтобы вы копировали QObject
, так что вы не должны или ваш код не будет компилироваться!
Это (то есть наличие копии ctor private) является типичным и хорошим дизайном, который используется, когда объект нельзя делать копируемым.
В качестве решения попробуйте определить свой собственный конструктор копирования, чтобы QObect
конструктор копирования не вызывается.
Пример:
Video::Video(const Video&)
{;}
Других решений пока нет …