0

qtスクリプトのサンプルコードを書こうとしています。QObjecyコピー コンストラクターでを宣言するとき、私は正しいことをしていると思いました。また、自由に=演算子を宣言しました。しかし、このコードは私に

'QObject::QObject' : cannot access private member declared in class 'QObject'

エラー。

MyClassaである aを次のように宣言していQObjectます。私は、私がここで何をしているのかを誰かが見ることができるという事実を認識しています.

ヘッダー:

#ifndef SCRIPT_CLASSES_H
#define SCRIPT_CLASSES_H
#include "QObject"
#include "QtScript/QScriptValue"
#include "QtScript/QScriptable"
#include "QtScript/QScriptClass"

class MyClass : public QObject
{
    Q_OBJECT
//    Q_PROPERTY( int _id WRITE setId READ id )
public :
    MyClass(QObject *aparent =0) ;
    ~MyClass();

//     bool operator =(MyClass obj);

public slots:
    void setId(int d);
    int id() const ;
//    bool MyClass::equals(const MyClass &other);
private :
    int _id;
};

class QScriptEngine;
class Script_Classes : public QObject, public QScriptClass
{
public:
    Script_Classes(QScriptEngine *engine);
    ~Script_Classes();
private :
    static QScriptValue myClassToScript(QScriptEngine *engine,const MyClass &in);
    static void myClassFromScript(const QScriptValue &object, MyClass &out);
};

#endif // SCRIPT_CLASSES_H

私のソースクラスは次のとおりです。

#include "script_classes.h"
#include "QMetaType"
#include "QtScript/QScriptEngine"
#include "QtScript/QScriptValue"

Q_DECLARE_METATYPE(MyClass)
Q_DECLARE_METATYPE(MyClass*)

MyClass::MyClass(QObject *aparent) : QObject (aparent){}

MyClass::~MyClass(){}

void MyClass::setId(int d){
    _id = d;
}


int MyClass::id() const{
   return _id;
}

bool MyClass::equals(const MyClass &other)
{
    return id() == other.id();
}

bool MyClass::operator =(MyClass obj){
    return id()==obj.id();
}



Script_Classes::Script_Classes(QScriptEngine *engine):QObject(engine),QScriptClass(engine)
{
    qScriptRegisterMetaType<MyClass>(engine, myClassToScript, myClassFromScript);
    MyClass testClass(this);
}

void Script_Classes::myClassFromScript(const QScriptValue &object, MyClass &out){
out.setId(object.property("id").toInt32());
}

QScriptValue Script_Classes::myClassToScript(QScriptEngine *engine, const  MyClass &in)    
{
    QScriptValue value = engine->newObject();
    value.setProperty("id", in.id());
    return value;
}
4

1 に答える 1

8

問題は、コピーできないことですQObjectQObjectドキュメントから:

QObject には、コピー コンストラクターも代入演算子もありません。 これは仕様によるものです。実際には、それらは宣言されていますが、マクロ Q_DISABLE_COPY() を持つプライベート セクションにあります。実際、QObject (直接または間接) から派生したすべての Qt クラスは、このマクロを使用して、コピー コンストラクターと代入演算子をプライベートとして宣言します。その理由は、Qt Object Model ページの Identity vs Value に関する議論にあります。

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

またQObject==実装されていないため、クラスの 2 つのインスタンスを比較することはできません。

PS=オペレーターを過負荷にして、そのように動作させるポイントは何==ですか? これにより、コードが難読化され、デバッグがはるかに複雑になります。

編集

から継承する次の単純なクラスがあるとします。QObject

class A : public QObject
{
     Q_OBJECT
public:
     int anInt;
     double aDouble;
}

Aコードのどこかに2 つのインスタンスを作成するとします。

A a1;
A a2;

operator は公開されていないa1=a2ため、呼び出すのは違法です。QObject's =データのコピーを行うために必要なことは、手動で行うことです。

a2.anInt = a1.anInt
a2.aDouble = a1.aDouble

一方、ポインターを使用した場合、同じオブジェクトを指すことは完全に合法です

A* a1 = new A;
A* a2 = new A;
a1 = a2;

両方とも同じメモリ位置a1a2指し、同じデータを持っています。2 つの異なるオブジェクトが必要な場合は、オブジェクトへのポインターを引数としてコンストラクターを作成できます。単純なクラスの場合、次のようになります。

A::A(A* a)
{
   anInt = a->anInt;
   aDouble = a->aDouble;
}

そして今、それは合法です:

A a1;
A a2(&a1);

なぜ割り当てが許可されないのか疑問に思っている場合は、オブジェクト モデル ドキュメントのID と値QObjectの部分を読んでください。

于 2011-11-11T16:12:01.277 に答える