1

次のように、videoというQtクラスを作成しました。

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

このクラスは、( QDjangoQDjangoModelに含まれている)という名前のクラスを拡張し、を拡張します。Qtクリエーターでクラスを作成すると、次のテンプレートが作成されます。QDjangoModelQObject

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。このエラーを修正するにはどうすればよいですか?

4

1 に答える 1

0

コードでコピー コンストラクターを提供しないため、コンパイラーが合成します。

コンパイラで合成されたコピー コンストラクターは、基本クラスのコピー コンストラクターを呼び出します。

このように実装されているようです(まあ、合成されています:)):

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

QObject::QObject(const QObject&)問題は、コンパイラで合成されたコピー コンストラクタから始まる呼び出しフローに、プライベートな呼び出しがあることだと思います。

Qt は をコピーしたくないQObjectので、コピーしないとコードがコンパイルされません!

これ (つまり、copy ctor を非公開にすること) は、オブジェクトをコピー可能にしない場合に使用される、典型的で優れた設計です。

QObect解決策として、コピー コンストラクターが呼び出されないように、独自のコピー コンストラクターを定義してみてください。

例:

Video::Video(const Video&) 
{;}
于 2012-09-29T14:35:36.113 に答える