1

我创建了一个名为 video 的 Qt 类,如下所示:

视频.h

class Video : public QDjangoModel {
    Q_OBJECT
//  ...

public:
    explicit Video(QObject *parent = 0);
//  ...
};

视频.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。我该如何解决这个错误?

4

1 回答 1

0

由于您没有在代码中提供复制构造函数,因此编译器会为您合成一个。

编译器合成的复制构造函数调用基类复制构造函数。

就像它以:)这种方式实现(嗯,合成):

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

我认为问题在于,在从编译器合成的复制构造函数开始的调用流程中,有一个QObject::QObject(const QObject&)私有调用。

Qt 不想让你复制QObject,所以你不能这样做,否则你的代码将无法编译!

这(即,将复制 ctor 设为私有)是一种典型且良好的设计,用于不应该使对象可复制的情况。

作为一种解决方案,请尝试定义自己的复制构造函数,以免QObect调用复制构造函数。

例子:

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