0

こんにちはQVectorQThreadオブジェクトを構築しようとしていますが、構築しようとするとこのエラーが発生します'QObject::QObject' : cannot access private member declared in class 'QObject'。このエラーが発生する理由と、それを克服する方法、または回答の方向に向ける方法を誰かに教えてもらえますか。ありがとうございました。

メイン.CPP

#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 Object Model ページの Identity vs Value に関する議論にあります。

主な結果は、QObject (または QObject サブクラス) へのポインターを使用する必要があるということです。そうしないと、QObject サブクラスを値として使用したくなる可能性があります。たとえば、コピー コンストラクターがないと、コンテナー クラスの 1 つに格納される値として QObject のサブクラスを使用できません。ポインタを格納する必要があります。

そのため、スレッドを保存するために を使用する必要がありますQVector<Thread*>(使用する前にオブジェクトを作成することを忘れないでください)。

QVector のドキュメントにも記載されています。

QVector の値の型は、割り当て可能なデータ型でなければなりません。これは、一般的に使用されるほとんどのデータ型をカバーしますが、コンパイラでは、たとえば、QWidget を値として格納することはできません。代わりに、QWidget * を保存します。いくつかの機能には追加の要件があります。たとえば、indexOf() と lastIndexOf() は、値の型が operator==() をサポートすることを想定しています。これらの要件は、機能ごとに文書化されています。

于 2013-02-03T00:30:31.600 に答える