我认为
#ifndef SERVER
Q_OBJECT
#endif
导致
注意:未找到相关课程。没有输出。
来自我的编译器。可能是因为Qt预处理器正在查找的Q_OBJECT
不受C预处理器指令的影响(或没有受到其影响)。处理这个问题的正确方法是什么?
我这样做是因为我不需要服务器上的信号插槽爵士乐,所以为了提高效率,我取消了声明。
我在Ubuntu 64位上运行Qt 4.8在GNU中构建。
答案 0 :(得分:1)
此处所有实例(服务器,客户端等)都是从top_Server实例化的。
重要的是,当客户端类实现Q_OBJECT宏时,服务器类永远不会调用Q_OBJECT宏。
顶级抽象类代码:
abstract_class.h
#ifndef ABSTRACT_CLASS_H
#define ABSTRACT_CLASS_H
#include <QString>
class top_Server // Abstract Class
{
public:
virtual bool method1 (QString,QString) =0;
};
#endif // ABSTRACT_CLASS_H
然后SERVER派生类声明
server.h
#ifndef SERVER_H
#define SERVER_H
#include "abstract_class.h"
#include <QObject>
class Server: public top_Server
{
public:
explicit Server (QString ,QString, QObject *parent = nullptr);
bool method1 (QString,QString);
};
#endif // SERVER_H
然后客户端派生类声明
client.h
#ifndef CLIENT_H
#define CLIENT_H
#include <QObject>
#include "abstract_class.h"
class client: public QObject, public top_Server // Client class inherits Abstract class and runs the Q_OBJECT macro
{
Q_OBJECT
public:
explicit client(QString ,QString, QObject *parent = nullptr);
bool method1 (QString,QString);
};
#endif // CLIENT_H
然后是.CPP文件中的类代码
client::client(QString DB_user, QString DB_pwd, QObject *parent) : QObject(parent)
{
}
bool client::method1(QString str1, QString str2)
{
}
Server::Server (QString str1 ,QString str2 , QObject *parent)
{
}
bool Server::method1(QString str1, QString str2)
{
}
现在隐藏服务器和客户端的实现,并且可以使用相同的类名实例化任何实现,也可以从一个对象切换到另一个对象:
top_Server *common_object_name;
然后可以使用某个客户端:
common_object_name = new client;
.... 以及其他地方的服务器
common_object_name = new server;
成本是知道有两个隐藏类,而优势显而易见!
答案 1 :(得分:0)
(对不起,我还没有评论,所以我回答。)
如果可能的话,我会建议@Mohammad Kanan的方式。
否则,Qt的moc在解析代码时会定义Q_MOC_RUN
。这样,使用#ifndef Q_MOC_RUN [...] #endif
,您可以完全排除代码部分被moc处理。 (参考:https://doc.qt.io/archives/qt-4.8/moc.html#command-line-options)