微凉的衣柜 2022-04-12 16:14 采纳率: 64.7%
浏览 76
已结题

Qt将主线程类设为子线程类友元类后头文件相互包含问题

主线程类声明定义如下:
Http_Get.h:

#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_Http_Get.h"
#include "post_thread_test.h"//此处包含了子线程类
#include<QtNetwork/QNetworkReply>
#include <QJsonObject>
#include<QJsonArray>
#include<QJsonDocument>
#include <QSslConfiguration>
#include <QtNetwork/QNetworkAccessManager>
#include <QString>
#include <QDebug>
#include <QVector>
#include <QFile>
#include <QDateTime>
#include <QDir>
#include <QString>
#include <QTime>
#include <QThread>
#include <QCoreApplication>

class Http_Get : public QMainWindow
{
    Q_OBJECT
public:
    Http_Get(QWidget *parent = Q_NULLPTR);
    ~Http_Get();

private:
    Ui::Http_GetClass ui;
    void test_thread();
    void friend_function();

    QNetworkAccessManager *accessManager;
    QJsonObject jsonObject;
    QJsonDocument jsonDoc;
    QNetworkRequest request;
    QString ip_ad;
    QVector<Post_v> post_con;
    
    Post_v temp_post;
    QThread *post_thread;
    post_thread_test* mythreadT;//声明线程类

signals:
    void ex_post_thread(QVector<QString>*);
    
};

Http_Get.cpp:

void Http_Get::test_thread()
{
    mythreadT->test_a = 10.58;//访问子线程中的私有变量
    mythreadT->moveToThread(post_thread);
    post_thread->start();
    emit ex_post_thread(thread_vec);
}

子线程类声明如下:
post_thread_test.h:

#pragma once

#include <QObject>
#include <QThread>
#include <QVector>
#include <QString>
#include <QDebug>
#include<QtNetwork/QNetworkReply>
#include <QJsonObject>
#include<QJsonArray>
#include<QJsonDocument>//json
#include <QSslConfiguration> //https
#include <QtNetwork/QNetworkAccessManager>
#include <QTime>
#include <QCoreApplication>
//#include "Http_Get.h"//此处不可以包含主线程的头文件,否则会报错

class post_thread_test : public QObject
{
    Q_OBJECT
    friend class Http_Get;
    //friend void Http_Get::friend_function();会报错
public:
    post_thread_test(QObject *parent = Q_NULLPTR);
    ~post_thread_test();
    void post_collect(QVector<QString>*);

private:
    double test_a = 0;//可以在主线程类中访问该私有变量
    
};

此时可以在主线程(Http_Get)中访问子线程(post_thread_test)私有变量。但主线程和子线程的头文件不可以相互包含(post_thread_test.h不可以包含#include "Http_Get.h"),然而在子线程中依然可以设置主线程类为友元类。但如果想设置主线程中的成员函数为友元函数(friend void Http_Get::friend_function();)则不可以。此处应该如何在主线程类和子线程类中相互引用头文件?

  • 写回答

1条回答 默认 最新

  • bostonAlen 2022-04-12 16:56
    关注

    必须将先定义的类的成员函数作为后定义类的友元函数,调换顺序会出现语法错误

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月15日
  • 已采纳回答 12月7日
  • 创建了问题 4月12日

悬赏问题

  • ¥15 echarts动画效果失效的问题。官网下载的例子。
  • ¥60 许可证msc licensing软件报错显示已有相同版本软件,但是下一步显示无法读取日志目录。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥30 关于<main>标签页面跳转的问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加