如何在成员类中传入this指针? 一加上include就报错

Melodybeiz 2017-01-08 09:27:45
我目前是用QT在写一个GUI程序
有两个类
QTGUI类 主类,主要负责GUI,然后其中private下含有类TYCTPSpi *spi; 这个TYCTPSpi类主要用来接收业务逻辑接口回传过来的数据,我的目的就是在这个SPI类中接到数据后显示在GUI的label里。
但是问题来了,我无法再SPI类中调用TYGUI的函数,或者说无法获取实例化后的TYGUI类的指针。。
然后我想了一个办法 就是在新建TYCTPSpi类的时候构造函数里就把该指针传入:
TYCTPSpi * spi = new TYCTPSpi(this);
但是在操作的时候,我发现我只要在TYCTPSpi类中 include "TYGUI.h"就会报错。
以下是代码
TYGUI.h:
#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_TYGUI.h"
#include <QString>
#include <QPushButton>
#include <QLabel>
#include <QLineEdit>
#include <QGridLayout>
#include "ThostFtdcTraderApi.h"
#include "global_config.h"
#include "TYCTPSpi.h"
class TYGUI : public QMainWindow
{
Q_OBJECT

public:
TYGUI(QWidget *parent = Q_NULLPTR);
private:
Ui::TYGUIClass ui;
CThostFtdcTraderApi *api;
TYCTPSpi *spi;
private slots:
void click_login();
public:
int login(CThostFtdcReqUserLoginField *pReqUserLoginField, int nRequestID);
};


TYGUI.cpp:
#include "TYGUI.h"
#include <ThostFtdcTraderApi.h>
TYGUI::TYGUI(QWidget *parent)
: QMainWindow(parent)
{
//ui.setupUi(this);

setWindowTitle("TY API");
login_button->setText("log in");
QObject::connect(login_button, &QPushButton::clicked, this, &TYGUI::click_login);

api = CThostFtdcTraderApi::CreateFtdcTraderApi(pathOfLocalFiles);
//新建交易spi,该类中的private的api放入
this->spi = new TYCTPSpi(api);
api->RegisterSpi(spi);
api->RegisterFront(ipAddressOfTdFront);
api->SubscribePublicTopic(THOST_TERT_RESTART);
api->SubscribePrivateTopic(THOST_TERT_RESUME);
api->Init();
//api->Join();
}




void TYGUI::click_login()
{
CThostFtdcReqUserLoginField req;
memset(&req, 0, sizeof(req));
strcpy(req.BrokerID, BROKERID);
strcpy(req.UserID, ACCOUNT);
strcpy(req.Password, PASSWORD);
switch (login(&req, 0))
{
case 0:
status_label->setText("--->Login Request has been sent.");
break;
case -1:
status_label->setText("--->Not sent because network.");
break;
case -2:
status_label->setText("--->Not sent because queue is full.");
case -3:
status_label->setText("--->Not sent because too many request.");
default:
status_label->setText("--->Not sent because unknown reason.");
}

}

int TYGUI::login(CThostFtdcReqUserLoginField *pReqUserLoginField, int nRequestID)
{

return api->ReqUserLogin(pReqUserLoginField, nRequestID);
}



TYCTPSpi.h:
#pragma once
#include "ThostFtdcTraderApi.h"
#include <QString>
//#include "TYGUI.h" 这里一加就报错
class TYCTPSpi : public CThostFtdcTraderSpi
{
public:
TYCTPSpi(CThostFtdcTraderApi*);
//TYCTPSpi();
~TYCTPSpi();

private:
CThostFtdcTraderApi *pUserTradeApi;

public:

///登录请求响应
virtual void OnRspUserLogin(CThostFtdcRspUserLoginField *pRspUserLogin, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast);


};


TYCTPSpi.cpp


#include <time.h>
#include <TYCTPSpi.h>
#include <QTextStream>
#include <QDebug>
#include <stdio.h>


QTextStream cin(stdin, QIODevice::ReadOnly);

QTextStream cout(stdout, QIODevice::WriteOnly);

QTextStream cerr(stderr, QIODevice::WriteOnly);


TYCTPSpi::TYCTPSpi(CThostFtdcTraderApi *api)
{
this->pUserTradeApi = api;
}


TYCTPSpi::~TYCTPSpi()
{
}


void TYCTPSpi::OnRspUserLogin(CThostFtdcRspUserLoginField *pRspUserLogin, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{
qDebug() << "--->" << __FUNCTION__ << "<----";
if (pRspInfo->ErrorID == 0) {
qDebug() << "Login Success!" ;
}
else {
qDebug() << "Sorry, Login Failed!" << "reason:\t" << pRspInfo->ErrorMsg << endl;
}

}




在TYCTPSpi.h中 一加上 #include "TYGUI.h"(上文已注释掉)就报错:
error C2143: 语法错误: 缺少“;”(在“*”的前面)
error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
error C2238: 意外的标记位于“;”之前

并且出错的位置是在TYGUI.h中。。很奇怪
位置是在private:下面的 TYCTPSpi * spi;

我这里include很奇怪为什么不行
不知道去百度上怎么查了。。
...全文
67 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
清泉流 2017-01-08
  • 打赏
  • 举报
回复
是TYCTPSpi.h和TYGUI.h循环引用的问题,在TYGUI.h里面使用前置声明:class TYCTPSpi;去掉#include"TYCTPSpi.h"
Melodybeiz 2017-01-08
  • 打赏
  • 举报
回复
我本身不传入this指针的话就只能通过qDebug() 来显示TYCTPSpi::OnRspUserLogin里传过来的数据,我想显示在GUI界面里面。 还是说我这里本身传入this指针的想法就有问题? 一般标准做法是什么?

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧