Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.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
虚拟Qt信号? 复习一些QT C++代码时,我发现: class Foo { Q_OBJECT signals: virtual void someSignal(const QString& str, int n) { Q_UNUSED(str); Q_UNUSED(n); } ... };_C++_Qt - Fatal编程技术网

虚拟Qt信号? 复习一些QT C++代码时,我发现: class Foo { Q_OBJECT signals: virtual void someSignal(const QString& str, int n) { Q_UNUSED(str); Q_UNUSED(n); } ... };

虚拟Qt信号? 复习一些QT C++代码时,我发现: class Foo { Q_OBJECT signals: virtual void someSignal(const QString& str, int n) { Q_UNUSED(str); Q_UNUSED(n); } ... };,c++,qt,C++,Qt,现在,Qt信号不能有一个主体,所以我很惊讶这甚至可以编译(可能是因为主体实际上是空的)。我也不认为把信号虚拟化有什么意义。。。它不能有一个主体,那么它怎么能被覆盖呢 我是否遗漏了一些东西,或者这是一种有效的代码气味?在我看来很难闻 在基类中声明一个信号,然后从派生类发出它是有效的,例如 class MyBase : public QObject { Q_OBJECT // ... signals: void somethingHappened(); }; class MyDer

现在,Qt信号不能有一个主体,所以我很惊讶这甚至可以编译(可能是因为主体实际上是空的)。我也不认为把信号虚拟化有什么意义。。。它不能有一个主体,那么它怎么能被覆盖呢


我是否遗漏了一些东西,或者这是一种有效的代码气味?

在我看来很难闻

在基类中声明一个信号,然后从派生类发出它是有效的,例如

class MyBase : public QObject
{
    Q_OBJECT
// ...
signals:
    void somethingHappened();
};

class MyDerived : public MyBase
{
    Q_OBJECT
// ...
    void doSomething();
};

void MyDerived::doSomething()
{
    // ....
    emit somethingHappened();
}

这也许就是问题中声明的意思。

< P>严格的C++,它编译正常,给出了<代码>信号<代码>是一个宏,用于<代码>保护< /代码>,<代码> QuununUn>代码>是一个强制转换为<代码>无效>代码>。
但是,在运行
moc
时,您应该会遇到一个错误,它精确地创建了声明为信号的方法的实现。

Qt信号不允许是(纯)虚拟的。请参阅对此错误的评论-

TL;DR:我不知道代码的作用是什么,但它是错误的(不仅仅是气味不对,它表面上是无效的)。信号实施总是由主运行中心生成。应移除信号主体

  • 为了让代码正常工作,它应该完成三项工作:编译、通过moc和链接。你的代码确实是编译的——C++编译器没有理由不编译。但它不会通过商务部,也不会链接

  • 尽管2010年商务部可能没有检测到其中一些,但以下是商务部今天的行动:

    a) moc不允许在类主体中定义信号,带有诊断
    错误:不是信号声明
    。So
    classx{Q_信号void s(){}
    触发它,但是
    类X{Q_SIGNAL void s();};void X::s(){}
    不会

    b) moc不允许在非从
    QObject
    派生的类中使用
    Q\u对象
    宏,诊断
    错误:类包含Q\u对象宏,但不从QObject继承

  • 由于在类中讨论不是从
    QObject
    派生的信号没有任何意义,让我们假设代码实际上如下所示:

    class Foo : public QObject
    {
      Q_OBJECT
    signals:
      virtual void someSignal(const QString&, int);
    };
    void Foo::someSignal(const QString& str, int n)
    {
      Q_UNUSED(str);
      Q_UNUSED(n);
    }
    
    这将通过moc并编译,但不会链接。链接器将对
    Foo::someSignal
    的多个声明发出诊断。此文件中有一个定义,moc生成的源文件中有另一个定义


  • 它可以编译,但仍然是ODR冲突:该函数有两个主体,一个在头中,一个在moc发出的cpp中。