“不允许指向不完整类类型的指针”
Posted
技术标签:
【中文标题】“不允许指向不完整类类型的指针”【英文标题】:"Pointer to incomplete class type is not allowed" 【发布时间】:2021-12-31 10:27:59 【问题描述】:由于某种原因,我不能使用附加到“代理”对象的“getNotify()”函数。我在不起作用的行中添加了注释(在“Publisher”类中)。作为一个错误,我得到“错误;不允许指向不完整类类型的指针”请帮助
“Broker”类是用 Singleton-Pattern 实现的 Broker.h 类:
#ifndef DEF_Broker
#define DEF_Broker
#include <iostream>
#include "classes.h"
using namespace std;
class Broker : Publisher
static Broker *instance;
Broker();
public:
static Broker* getInstance()
if(!instance)
instance = new Broker();
return instance;
void getNotify()
for(auto sub : SubscriberList)
if(t.msg == "Hello World")
SubCount++;
cout << SubCount << " - ";
sub->update(t.msg);
else if(t.msg == "Ping")
cout << "Ping" << endl;
sub->update("Pong");
;
Broker *Broker::instance = 0; // Null, because instance will be initialized on demand.
Broker::Broker(); // Private constructor so that no objects can be created.
#endif
classes.h:
#ifndef DEF_classes
#define DEF_classes
#include <iostream>
#include <list>
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;// = broker->getInstance();
Publisher()
Publisher(Topic t)
this->t = t;
;
void AddSub(Subscriber *sub)
SubscriberList.push_back(sub);
void notify(string msg)
broker->getNotify(); // this not working
;
int Publisher::SubCount = 0; // Initialize static member SubCount
#endif
【问题讨论】:
您似乎没有在classes.h
中包含 Broker.h
。如果不这样做,您将无法使用broker->getNotify()
。
【参考方案1】:
@Ben @AnnopRana 谢谢大家。 我从你的答案中得到启发,我得到了以下解决方案
broker.h
#ifndef DEF_Broker
#define DEF_Broker
#include <iostream>
#include "classes.h"
using namespace std;
class Broker
static Broker *instance;
Broker();
public:
Publisher pub;
static Broker* getInstance()
if(!instance)
instance = new Broker();
return instance;
void getNotify()
for(auto sub : pub.SubscriberList)
if(pub.t.msg == "Hello World")
pub.SubCount++;
cout << pub.SubCount << " - ";
sub->Subscriber::update(pub.t.msg);
else if(pub.t.msg == "Ping")
cout << "Ping" << endl;
sub->Subscriber::update("Pong");
else
cout << "no such as topic" << endl;
;
Broker *Broker::instance = 0; // Null, because instance will be initialized on demand.
Broker::Broker(); // Private constructor so that no objects can be created.
#endif
classes.h
#ifndef DEF_classes
#define DEF_classes
#include <iostream>
#include <list>
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
public:
list<Subscriber*> SubscriberList;
static int SubCount;
Topic t;
Publisher()
Publisher(Topic t)
this->t = t;
;
void AddSub(Subscriber *sub);
void notify(Broker *b);
;
#endif
publisher.cpp
#include "classes.h"
#include "Broker.h"//needed for broker->getNotify()
using namespace std;
int Publisher::SubCount = 0; // Initialize static member SubCount
void Publisher::notify(Broker *b)
b->getNotify();
void Publisher::AddSub(Subscriber *sub)
SubscriberList.push_back(sub);
【讨论】:
【参考方案2】:解决此问题的一种可能方法是为不同的类创建不同的文件(头文件和源文件)。在这种情况下,我已为您完成此操作,以便您可以将此示例作为参考(起点)用于您未来的目的/程序。以下是所有文件:
Borker.h
#ifndef DEF_Broker
#define DEF_Broker
#include <iostream>
#include "Publisher.h"
class Broker : Publisher
static Broker *instance;
Broker();
public:
static Broker* getInstance()
if(!instance)
instance = new Broker();
return instance;
void getNotify();
;
#endif
Broker.cpp
#include "Broker.h"
#include "Subscriber.h"
Broker *Broker::instance = 0; // Null, because instance will be initialized on demand.
void Broker::getNotify()
for(auto sub : SubscriberList)
if(t.msg == "Hello World")
SubCount++;
std::cout << SubCount << " - ";
sub->update(t.msg);
else if(t.msg == "Ping")
std::cout << "Ping" << std::endl;
sub->update("Pong");
Broker::Broker()
; // Private constructor so that no objects can be created.
Topic.h
#ifndef TOPIC_H
#define TOPIC_H
#include <iostream>
#include <list>
#include <string>
class Topic
public:
std::string msg;
Topic()
Topic(std::string msg);
;
#endif
Topic.cpp
#include "Topic.h"
Topic::Topic(std::string msg)
this->msg = msg;
Publisher.h
#ifndef PUBLISHER_H
#define PUBLISHER_H
#include <list>
#include "Topic.h"
class Broker;//needed for Borker *broker
class Subscriber;//needed for Subscriber*
class Publisher
protected:
std::list<Subscriber*> SubscriberList;
static int SubCount;
public:
Topic t;
Broker *broker;// = broker->getInstance();
Publisher()
Publisher(Topic t)
this->t = t;
;
void AddSub(Subscriber *sub);
void notify(std::string msg);
;
#endif
Publisher.cpp
#include "Publisher.h"
#include "Broker.h"//needed for broker->getNotify()
int Publisher::SubCount = 0; // Initialize static member SubCount
void Publisher::notify(std::string msg)
broker->getNotify(); // this not working
void Publisher::AddSub(Subscriber *sub)
SubscriberList.push_back(sub);
Subscriber.h
#ifndef SUBSCRIBER_H
#define SUBSCRIBER_H
#include <string>
class Subscriber
public:
void update(std::string msg);
;
#endif
Subscriber.cpp
#include "Subscriber.h"
#include <iostream>
void Subscriber::update(std::string msg)
std::cout << msg << std::endl;
程序编译成功,可以看到here。
【讨论】:
【参考方案3】:通常您需要在 classes.h 中包含 broker.h,但是,这会产生循环依赖。
因此,在 .cpp 文件中实现 Publisher 的功能,并将 broker.h 包含在该文件中。 classes.h (class broker;) 中的前向声明需要保留。
【讨论】:
以上是关于“不允许指向不完整类类型的指针”的主要内容,如果未能解决你的问题,请参考以下文章