“不允许指向不完整类类型的指针”

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-&gt;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;) 中的前向声明需要保留。

【讨论】:

以上是关于“不允许指向不完整类类型的指针”的主要内容,如果未能解决你的问题,请参考以下文章

完整性约束

数据完整性约束——实体完整性参照完整性

数据库完整性(实体完整性,参照完整性,用户定义完整性)

什么是数据库的关系完整性

数据库完整性和约束

指向不完整类型的指针可以不完整吗?