C++ C++;带复制和赋值的Qt反射
正如许多其他人所解释的那样,C++ C++;带复制和赋值的Qt反射,c++,qt,copy-constructor,assignment-operator,qobject,C++,Qt,Copy Constructor,Assignment Operator,Qobject,正如许多其他人所解释的那样,QObject具有标识,因此隐藏了其复制构造函数和赋值运算符 但是,我不是从QObject派生出它的动态属性特性或信号/插槽特性。我只想要反射,或者能够访问Foo::staticMetaObject class Foo : public QObject { Q_OBJECT Q_ENUMS(Color) public: enum Color { Blue, Red, Pink }; private: Color color; }; Q
QObject
具有标识,因此隐藏了其复制构造函数和赋值运算符
但是,我不是从QObject
派生出它的动态属性特性或信号/插槽特性。我只想要反射,或者能够访问Foo::staticMetaObject
class Foo : public QObject {
Q_OBJECT
Q_ENUMS(Color)
public:
enum Color { Blue, Red, Pink };
private:
Color color;
};
Q_DECLARE_METATYPE(Foo::Color)
然后,我无法使用以下命令复制Foo
:
Foo a;
Foo b;
a = b;
在这种情况下,允许复制和分配的最佳方式是什么?我真的需要写一个复制构造函数和赋值操作符吗?他们看起来像什么?反射仍然有效吗?我不太了解
qt
,但是如果不允许使用复制构造函数,那么应该有它的原因(在您发布的链接中讨论)。你可以改变你的设计,让它不存在
不过,如果你坚持的话,这可能是你最后的选择。我个人不建议这样做,因为您必须注意深度复制、vtable等,它们并不总是微不足道的。您当然可以在派生类中实现复制构造函数和复制赋值运算符,但这可能是设计不好的迹象。举个例子:
#include <iostream>
class Base {
public:
Base() {}
private:
Base(const Base& other) {
std::cout << "Base copy constructor invoked!" << std::endl;
}
};
class Derived : public Base {
public:
Derived() {}
Derived(const Derived& other) {
std::cout << "Derived copy constructor invoked!" << std::endl;
}
};
int main(int argc, char** argv) {
Derived a;
Derived b = a;
return 0;
}
#包括
阶级基础{
公众:
Base(){}
私人:
基础(施工基础和其他){
std::cout如果您只对反射感兴趣
- 类名
- 枚举和标志(Q_枚举、Q_标志)
- 类信息()
您可以使用:
它将声明和定义Foo::staticMetaObject
您的意思是它不使用QObject
。因为反射不是问题的根源。问题是QObject将复制和分配设为私有(有充分的理由)@kristianp,好建议,如果@alexisdm没有提供我的确切问题的确切答案,我会进行编辑。答案通常是“不要做你要求做的事”但在这种情况下,即使这是一个合理的答案,也有一个确实让我做了我想做的事情:Q_GADGET
哇,我以前没有听说过Q_GADGET
。所以它似乎是Q_OBJECT
的轻量级静态版本,在某些情况下非常有用(像这样)遗憾的是,它没有文档记录,至少我找不到它。这使得它成为非官方的,因此不保证将来会起作用:(@leemes它实际上是在QObject
页面上与QObject
一起简要提到的(我添加了上面的链接).但是你可以说它隐藏得很好,我只是在moc源代码中搜索其他东西时才发现的。
class Foo : public QObject {
Q_OBJECT
Q_ENUMS(Color)
public:
enum Color { Blue, Red, Pink };
private:
Color color;
};
Q_DECLARE_METATYPE(Foo::Color)