Что я могу поместить в инициализацию унаследованного класса в Qt

Я создал класс 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. Что я могу исправить эту ошибку?

1

Решение

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

Синтезированный компилятором конструктор копирования вызывает конструктор копирования базового класса.

Это как это реализовано (ну, синтезировано :) ) сюда:

Video::Video(const Video&) : QDjangoModel::QDjangoModel(const QDjangoModel&)
{ /* [...] */ }

Я думаю, что проблема в том, что в потоке вызовов, начиная с конструктора копирования, синтезированного компилятором, есть вызов QObject::QObject(const QObject&) который является частным.

Qt не хочет, чтобы вы копировали QObject, так что вы не должны или ваш код не будет компилироваться!

Это (то есть наличие копии ctor private) является типичным и хорошим дизайном, который используется, когда объект нельзя делать копируемым.

В качестве решения попробуйте определить свой собственный конструктор копирования, чтобы QObect конструктор копирования не вызывается.

Пример:

Video::Video(const Video&)
{;}
0

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

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

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