Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;带复制和赋值的Qt反射_C++_Qt_Copy Constructor_Assignment Operator_Qobject - Fatal编程技术网

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)