调用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会触发循环嵌套报错。
解决步骤
- 拆分类的声明与实现:将
Publisher::notify()的实现从类声明中移到单独的.cpp实现文件中,在实现文件头部引入Broker.h即可避开循环引用、获取到Broker的完整类定义。 - 修复
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
相关产品推荐
相关产品推荐

