【问题标题】:'QObject::QObject(const QObject&)' is private [duplicate]'QObject::QObject(const QObject&)' 是私有的
【发布时间】:2015-05-20 09:23:20
【问题描述】:

我收到了错误:

C:\Qt\5.3\mingw482_32\include\QtCore\qobject.h:465: error : 'QObject::QObject(const QObject&)' is private
     Q_DISABLE_COPY(QObject)
                    ^
Qt\MyMediaLibraries\MyMediaLibraries\cpp.films\Movie.h:10: error : within this context
 class Movie: public QObject
   ^

我已经阅读了很多关于它的内容,但我真的不知道我的情况出了什么问题。我知道 QObject 构造函数是不可复制的,但我不在这里这样做。或者实际上我不知道我正在这样做^^。这是我的代码: 电影.h:

class Movie: public QObject
{

    Q_OBJECT

public:
    Movie();
    Movie(const int &movie_id, const QString &movie_title, const QString &movie_md5, const QDate &movie_releaseDate, const QString &movie_genre,
          const int &movie_note, const bool &movie_alreadySeen, const bool &movie_favourite, const bool &movie_toBeSeen,
          const QString &movie_synopsis, const int &movie_duration, const QString &movie_backdropPath, const QString &movie_path,
          const QString &movie_backdropMD5, const QString &movie_posterMD5, const QString &movie_posterPath, const QString &movie_collection);
    void getInfos();

    //TheMovieDB *tmdb;

    int id;
    QString title;
    QDate releaseDate;
    QString genre;
    int note;
    bool alreadySeen;
    bool favourite;
    bool toBeSeen;
    QString synopsis;
    int duration;
    QString path;
    QString md5;
    QString backdropPath;
    QString backdropMD5;
    QString posterPath;
    QString posterMD5;
    QString collection;

public slots:
    void updateDatas();
};

电影.cpp:

Movie::Movie()
{
    title = "";
    md5 = "";
    id = 0;
    path = "";
    releaseDate = QDate();
    genre = "";
    note = 0;
    alreadySeen = false;
    favourite = false;
    toBeSeen = false;
    synopsis = "";
    duration = 0;
    backdropPath = "";
    backdropMD5 = "";
    posterPath = "";
    posterMD5 = "";
    collection = "";
}

Movie::Movie(const int &movie_id, const QString &movie_title, const QString &movie_md5, const QDate &movie_releaseDate,
             const QString &movie_genre, const int &movie_note, const bool &movie_alreadySeen, const bool &movie_favourite,
             const bool &movie_toBeSeen, const QString &movie_synopsis, const int &movie_duration,
             const QString &movie_backdropPath, const QString &movie_path, const QString &movie_backdropMD5,
             const QString &movie_posterMD5, const QString &movie_posterPath, const QString &movie_collection)
{
    id = movie_id;
    title = movie_title;
    md5 = movie_md5;
    path = movie_path;
    releaseDate = movie_releaseDate;
    genre = movie_genre;
    note = movie_note;
    alreadySeen = movie_alreadySeen;
    favourite = movie_favourite;
    toBeSeen = movie_toBeSeen;
    synopsis = movie_synopsis;
    duration = movie_duration;
    backdropPath = movie_backdropPath;
    backdropMD5 = movie_backdropMD5;
    posterPath = movie_posterPath;
    posterMD5 = movie_posterMD5;
    collection = movie_collection;
}

void Movie::getInfos()
{
    QObject::connect( tmdb , SIGNAL( dataRetrieved() ) , this , SLOT( updateDatas() ));
    tmdb->search(title);
}


void Movie::updateDatas()
{
    title = tmdb->t_infosList["title"].toString();
    md5 = "";
    id = tmdb->t_infosList["id"].toInt();
    path = "";
    releaseDate = tmdb->t_infosList["release_date"].toDate();
    note = tmdb->t_infosList["note"].toInt();
    synopsis = tmdb->t_infosList["overview"].toString();
    backdropPath = tmdb->t_infosList["backdrop"].toString();
    backdropMD5 = GeneralFunctions::hashMD5(tmdb->t_infosList["backdrop"].toString());
    posterPath = tmdb->t_infosList["poster"].toString();
    posterMD5 = GeneralFunctions::hashMD5(tmdb->t_infosList["poster"].toString());
    collection = tmdb->t_infosList["collection"].toString();

    QStringList genres = tmdb->t_infosList["genres"].toStringList();
    genre = genres[0];
    for(int i=0 ; i<genres.size() ; i++)
    {
        genre =genre + ", " + genres[i];
    }
}

感谢您的帮助

【问题讨论】:

  • 您的根本问题是您试图将 Movie 对象复制到某处,但由于基类的原因无法这样做。也禁用您的电影的复制构造函数,然后编译器将向您显示尝试复制的确切位置(如果它尚未这样做但未在您的错误消息中显示)。
  • 顺便说一句,你的第二个构造函数简直太可怕了。只需创建一个MovieInfo 结构,在Movie 类中添加一个以使其更干净,并使用一个接受该结构的构造函数。
  • 好的,我会考虑的。但实际上拥有一个包含所有这些变量的结构也将是可怕的。这意味着在使用它之前我必须知道我的班级中有哪些变量。使用结构意味着我不需要类 ^^(仅适用于函数)。

标签: c++ qt private qobject


【解决方案1】:

您只需阅读 Q_DISABLE_COPY 的文档

对给定的类禁用复制构造函数和赋值运算符。

QObject 子类的实例不应被视为值 可以复制或分配,但作为唯一身份。这意味着 当您创建自己的 QObject 子类(导演或 间接的),你不应该给它一个复制构造函数或赋值 操作员。然而,仅仅从你的 类,因为,如果您错误地编写了一些需要副本的代码 构造函数或赋值运算符(很容易做到),您的编译器 会为您精心打造。你必须做得更多。

好奇的用户会看到 Qt 类派生自 QObject 通常将此宏包含在私有部分中:

class MyClass : public QObject
{

  private:
    Q_DISABLE_COPY(MyClass)
};

【讨论】:

  • 我不明白。这意味着我不应该使用重载的构造函数?我将阅读一些关于 Q_DISABLE_COPY 的内容,因为我不明白。
  • Q_DISABLE_COPYQObject 中声明。你使用QObject 作为基类。您不应覆盖复制构造函数或 operator=
  • 所以是我的构造函数 Movie() 错了?我只想能够用这个类捕捉信号。我对 QObject 类没有其他用途。
  • 你只需要在你的类定义底部添加两行代码private: Q_DISABLE_COPY(Movie)
  • 我明白我不能复制。但我不明白我在代码中的哪个位置(我什至没有注意到它)。我已经删除了我的第二个构造函数,但错误仍然存​​在。
猜你喜欢
  • 1970-01-01
  • 2010-12-19
  • 2013-02-13
  • 2011-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-13
  • 1970-01-01
相关资源
最近更新 更多