关于demo.cpp:(.text.startup+0x8f): undefined reference to `vtable for SlotObject' ,问题探究

关于demo.cpp:(.text.startup+0x8f): undefined reference to `vtable for SlotObject’ ,问题探究

1、在学习信号和槽的过程中使用了一个小例子,编辑完成之后,却出现了编译报错(标题中提到的)。于是采用了临时的解决办法,将Q_OBJECT注释,信号函数 也被我增加了一定义体。 这样可以顺利的编译,并可以运行。但是之后又遇到了新的问题。

#include <QObject>
#include <QApplication>

class SigObject:public QObject
{

//Q_OBJECT              //如果包含,会有问题
signals:
    void sigvoid(){}   //不知道是不是版本的问题导致的,还是没有分文件导致的
    void sigint(int i){}

public:
    SigObject(QObject* parent = 0)
    :QObject(parent){}

    void sendVoid(){emit sigvoid();}  //emit 宏 调用函数

    void sendInt(int i){emit sigint(i);}

    virtual  ~SigObject(){}

};

int main(int argc,char** argv)
{
    QApplication app(argc,argv);

    SigObject sigObj;

    sigObj.sendVoid();
    sigObj.sendInt(5);

    return app.exec();
}

又在上述的程序基础上,增加了槽的类的定义。编译遇到同样的问题。
于是我又 偷懒,按照上面的处理办法使整个程序可以顺利编译。但是等到运行之后,程序提示无法连接(connect)信号。
于是我就懵逼了。百度之后,试了很多大神的方法。最终明白了,确实是编译器的一个bug问题。按照大神的提示:1、将工程目录下的文件(除了H和CPP)全部删掉 2、重新qmake -project ,qmake ,make 3、成功

  • 完善之后的程序如下:
/*sss.h*/
#ifndef SSS_HHH
#define SSS_HHH
#include <QObject>

class SigObject:public QObject
{
    Q_OBJECT
public:
    explicit SigObject(QObject* parent = 0); 
//阻止不应该允许的经过转换构造函数进行的隐式转换的发生。
//声明为explicit的构造函数不能在隐式转换中使用。
    ~SigObject();

    void sendVoid();
    void sendInt(int i);

signals:
    void sigVoid();
    void sigInt(int i);
};

class SlotObject:public QObject
{

    Q_OBJECT
public:
    explicit SlotObject(QObject* parent = 0);
    ~SlotObject();
public slots:
    void onSigVoid();
    void onSigInt(int i);
};

#endif
/*sss.cpp*/
#include "sss.h"
#include <QObject>

#include <QDebug>



SigObject::SigObject(QObject* parent)
    :QObject(parent)
{}

SigObject::~SigObject()
{}

void SigObject::sendVoid()
{emit sigVoid();}

void SigObject::sendInt(int i)
{emit sigInt(i);}

SlotObject::SlotObject(QObject* parent)
    :QObject(parent)
{}
SlotObject::~SlotObject()
{}

void SlotObject::onSigVoid()
    {
        qDebug()<<"slotvoid()";
    }
void SlotObject::onSigInt(int i)
    {
        qDebug()<<"slotint:"<<i;
    }
/*demo.cpp*/
#include <QObject>
#include <QApplication>
#include "sss.h"
int main(int argc,char** argv)
{
    QApplication app(argc,argv);

    SigObject sigObj;
    SlotObject slotObj;
    QObject::connect(&sigObj,SIGNAL(sigVoid()),\
                    &slotObj,SLOT(onSigVoid()));

    sigObj.sendVoid();
    //sigObj.sendInt(5);
    return app.exec();
}
心得:

可以多参考QT软件本身的工程程序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值