【问题标题】:"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()

标签: c++ class pointers incomplete-type


【解决方案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;) 中的前向声明需要保留。

      【讨论】:

        猜你喜欢
        • 2012-08-15
        • 2015-10-09
        • 1970-01-01
        • 2017-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多