Tha*_*nga 0 qt copy-constructor qobject
我正在尝试为qt脚本编写示例代码.当我向QObjecy副本建设者宣布时,我认为我做的是正确的事情,我也冒昧宣布=运营商.但是这段代码一直在给我
'QObject::QObject' : cannot access private member declared in class 'QObject'
Run Code Online (Sandbox Code Playgroud)
错误.
我声明MyClass这是一个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
Run Code Online (Sandbox Code Playgroud)
我的源类如下:
#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;
}
Run Code Online (Sandbox Code Playgroud)
问题是你无法复制QObject.从QObject文档:
QObject既没有复制构造函数也没有赋值运算符. 这是设计的.实际上,它们是声明的,但是在具有宏Q_DISABLE_COPY()的私有部分中.实际上,从QObject(直接或间接)派生的所有Qt类都使用此宏来声明其复制构造函数和赋值运算符是私有的.推理可以在Qt对象模型页面上关于Identity vs Value的讨论中找到.
主要结果是你应该使用指向QObject(或你的QObject子类)的指针,否则你可能会试图将QObject子类用作值.例如,如果没有复制构造函数,则不能使用QObject的子类作为要存储在其中一个容器类中的值.你必须存储指针.
也QObject没有==实现,所以你不能比较你的类的两个实例.
PS重载=运算符并让它像那样运行的重点==是什么?这使得代码混淆和调试变得更加复杂.
编辑
假设您继承了以下简单类 QObject
class A : public QObject
{
Q_OBJECT
public:
int anInt;
double aDouble;
}
Run Code Online (Sandbox Code Playgroud)
现在假设您要A在代码中的某处创建两个小数.
A a1;
A a2;
Run Code Online (Sandbox Code Playgroud)
a1=a2由于QObject's =运营商不公开,因此打电话是违法的.为了实现数据复制,您需要做的是手动完成:
a2.anInt = a1.anInt
a2.aDouble = a1.aDouble
Run Code Online (Sandbox Code Playgroud)
另一方面,如果你使用指针,指向同一个对象是完全合法的
A* a1 = new A;
A* a2 = new A;
a1 = a2;
Run Code Online (Sandbox Code Playgroud)
现在,这两个a1和a2点相同的内存位置,并具有相同的数据.如果你想拥有两个不同的对象,你可以创建一个带有参数的构造函数,指向对象的指针.对于我们的简单课程,您可以:
A::A(A* a)
{
anInt = a->anInt;
aDouble = a->aDouble;
}
Run Code Online (Sandbox Code Playgroud)
现在是合法的:
A a1;
A a2(&a1);
Run Code Online (Sandbox Code Playgroud)
如果您想知道为什么QObject不允许赋值,请阅读对象模型文档中的Identity vs Value部分.
| 归档时间: |
|
| 查看次数: |
993 次 |
| 最近记录: |