You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用Broker类getNotify报Pointer to incomplete class type错误求助

问题原因

  • 你的classes.h中仅对Broker做了前置声明class Broker;,没有引入完整的类定义,此时编译器仅知道Broker是一个类类型,完全不知道它内部包含getNotify()成员函数,所以调用broker->getNotify()时会抛出「不允许指向不完整类类型的指针」错误。
  • 同时现有代码存在头文件循环引用问题:Broker.h引用了classes.h,classes.h又需要用到Broker的完整定义,直接在classes.h中引入Broker.h会触发循环嵌套报错。

解决步骤

  1. 拆分类的声明与实现:将Publisher::notify()的实现从类声明中移到单独的.cpp实现文件中,在实现文件头部引入Broker.h即可避开循环引用、获取到Broker的完整类定义。
  2. 修复Publisher中broker指针的初始化逻辑:静态成员函数需要通过类名调用,不能用指针调用单例获取接口。

修改后代码示例

classes.h

#ifndef DEF_classes
#define DEF_classes
#include <iostream>
#include <list>
#include <string>

using namespace std;

class Broker;

class Subscriber
{
    public:
        void update(string msg)
        {
            cout << msg << endl;
        }

};

class Topic
{
    public:
        string msg;
        Topic(){};
        Topic(string msg)
        {
            this->msg = msg;
        }
};

class Publisher
{
    protected:
        list<Subscriber*> SubscriberList;
        static int SubCount; 
    
    public:
        Topic t;
        Broker *broker;
        Publisher();
        Publisher(Topic t);

        void AddSub(Subscriber *sub)
        {
            SubscriberList.push_back(sub);
        }

        // 仅保留函数声明,实现移到cpp文件
        void notify(string msg);
};
int Publisher::SubCount = 0;

#endif

新增classes.cpp实现文件

#include "classes.h"
#include "Broker.h"

Publisher::Publisher() {
    // 正确调用单例初始化broker指针
    broker = Broker::getInstance();
}

Publisher::Publisher(Topic t) {
    this->t = t;
    broker = Broker::getInstance();
}

void Publisher::notify(string msg) {
    broker->getNotify();
}

额外优化提示:当前Broker继承Publisher为默认private继承,若需要外部访问父类成员可改为class Broker : public Publisher,可根据自身业务逻辑调整。

内容的提问来源于stack exchange,提问作者jh.488

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 23:09:02