繁体   English   中英

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

[英]"Pointer to incomplete class type is not allowed"

由于某种原因,我不能使用附加到“经纪人”object 的“getNotify()”function。 我在不起作用的行中添加了一条评论(在“Publisher”类中)。 作为错误,我收到“错误;不允许指向不完整 class 类型的指针”请帮助

“经纪人”class 是用单例模式 Broker.h class 实现的:

#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

类.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,但是,这会创建一个循环依赖。

因此,在一个.cpp文件中实现Publisher的功能,并在该文件中包含broker.h。 classes.h (class broker;) 中的前向声明需要保留。

解决此问题的一种可能方法是为不同的类创建不同的文件(头文件和源文件)。 在这种情况下,我已为您完成此操作,以便您可以将此示例作为您未来目的/程序的参考起点)。 以下是所有文件:

博克.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

经纪人.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.

主题.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

主题.cpp

#include "Topic.h"
Topic::Topic(std::string msg)
{
    this->msg = msg;
}

发布者.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

发布者.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);
}

订阅者.h

#ifndef SUBSCRIBER_H
#define SUBSCRIBER_H
#include <string>
class Subscriber
{
    public:
        void update(std::string msg);

};

#endif

订阅者.cpp

 #include "Subscriber.h"
 #include <iostream>
 void Subscriber::update(std::string msg)
{
    std::cout << msg << std::endl;
}

程序编译成功,如下所示

@Ben @AnnopRanathanxs 伙计们。 我从你的答案中得到启发,我得到了以下解决方案

经纪人.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

类.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

发布者.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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM