0

您好,我正在尝试构建对象QVectorQThread但是当我尝试构建时出现此错误'QObject::QObject' : cannot access private member declared in class 'QObject'。有人可以告诉我为什么我会收到这个错误以及如何克服它或指出我的答案方向。谢谢你的时间。

主程序

#include <QCoreApplication>

#include "thread.h"
#include <QDebug>
#include <QThread>

main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    unsigned long long startingNumberAnswer = 0;
    unsigned long long totalIterationsAnswer = 0;
    int numberOfThreads = 10;


    QVector<Thread> threads(numberOfThreads);

    for(int l = 0; l < threads.size(); l++ ){
        threads[l].setPriority(QThread::TimeCriticalPriority);
    }


    for(int i = 1; i< 2000000; i+=numberOfThreads){
        qDebug() << "Longest iteration Number =  " << startingNumberAnswer;
        qDebug() << "Number of iterations for " << startingNumberAnswer << " is " << totalIterationsAnswer;
        qDebug() << "Running # " << i;


        system("CLS");

    }



    qDebug() << "Longest iteration Number =  " << startingNumberAnswer;
    qDebug() << "Number of iterations for " << startingNumberAnswer << " is " << totalIterationsAnswer;



    return a.exec();
}

线程.H

#ifndef THREAD_H
#define THREAD_H

#include <QObject>
#include <QThread>

class Thread :  public QThread
{
    Q_OBJECT
public:
    explicit Thread();

    unsigned long long getloops();
    unsigned long long getnumber();
signals:

public slots:
    void run(unsigned long long value);
private:
    unsigned long long largestNumber;
    unsigned long long loops;
    unsigned long long number;


};

#endif // THREAD_H

线程.CPP

#include "thread.h"

Thread::Thread()
{
}

void Thread::run(unsigned long long value)
{
   unsigned long long n = value;
   unsigned long long counter = 0;

   while ( n > 1){

       if(n%2 == 0){
          n = n/2;
       } else {
          n = (3*n) + 1;
       }

       counter++;
   }

    loops = counter;
    number = value;

}

unsigned long long Thread::getloops(){
    return loops;
}

unsigned long long Thread::getnumber(){
    return number;
}
4

1 回答 1

1

简而言之,QObject 对象不可复制也不可分配 - 请查看官方文档

没有复制构造函数或赋值运算符

QObject 既没有复制构造函数也没有赋值运算符。这是设计使然。实际上,它们是被声明的,但是在一个带有宏 Q_DISABLE_COPY() 的私有部分中。事实上,所有从 QObject 派生的 Qt 类(直接或间接)都使用这个宏来声明它们的复制构造函数和赋值运算符是私有的。推理可以在 Qt 对象模型页面上关于 Identity vs Value 的讨论中找到。

主要结果是您应该使用指向 QObject(或指向您的 QObject 子类)的指针,否则您可能会试图将 QObject 子类用作值。例如,如果没有复制构造函数,就不能使用 QObject 的子类作为要存储在容器类之一中的值。您必须存储指针。

因此,您将需要使用QVector<Thread*>来存储线程(不要忘记在使用它们之前创建对象)。

QVector 的文档中也提到了这一点:

QVector 的值类型必须是可赋值的数据类型。这涵盖了大多数常用的数据类型,但编译器不会让您,例如,将 QWidget 存储为值;相反,存储一个 QWidget *. 一些功能有额外的要求;例如,indexOf() 和 lastIndexOf() 期望值类型支持 operator==()。这些要求是按功能记录的。

于 2013-02-03T00:30:31.600 回答