0

我正在尝试在我的 C++ 基本游戏引擎中开发一个网络部分,但我遇到了一个相当奇怪的问题(它适合我)。

我有一个 Singleton Networker 类,它处理套接字 (UDP) 的设置,并将尝试注册客户端提供给服务器的用户名,返回一个布尔值,表示该用户名是否已被其他玩家使用。该类本身不处理数据包本身,我的目标是为此使用 Packethandler 类。

问题是我不希望客户端能够直接创建 PacketHandler,因为 Networker 类的全部意义在于提供某种接口来处理它。我的第一个想法是“将 Packethandler 的构造函数设为私有并创建一个 Singleton”,但当然客户仍然可以询问该实例。然后我很快虽然“保护得很好”,但 Networker 并没有扩展 PacketHandler。然后我想'好吧,让 Networker 成为 PacketHandler 的朋友'。到目前为止,我发现的所有信息似乎都在阻止 Friend 的使用,所以我想知道: 我对简单网络部分的计划是否存在缺陷,从而使我面临这样的问题,或者我的问题是朋友功能首先存在的原因?各位对此有何看法

编辑:我的想法的代码。

包处理程序.h

#ifndef FANCY_PACKET_HANDLER
#define FANCY_PACKET_HANDLER

#include <SFML/Network.hpp>

namespace fancy {
    namespace network {

        class PacketHandler 
        {
            friend class Networker;
        private:
            sf::IpAddress _hostAddress;
            sf::UdpSocket _socket;
            PacketHandler(std::string hostAdress);
        public:         
            ~PacketHandler();

            void sendPacket(const char* packet_data, const unsigned int packet_size);
            char* receivePacket();
        };

    }
}
#endif

网络人.h

#ifndef FANCY_NETWORKER
#define FANCY_NETWORKER

#include <SFML/Network.hpp>
#include <Engine/PacketHandler.h>

namespace fancy {
    namespace network {

        class Networker
        {       
        public:
            static Networker* instance();

            bool openUdpSocket(unsigned short port);

            bool registerUsername(char* username);
            char* receiveOnSocket();
        protected:
            Networker();
        private:
            static Networker* _instance;
            static PacketHandler* _packetHandler;

            const char* _username;

            sf::IpAddress _hostAddress;
            sf::UdpSocket _socket;
        };

    }
}

#endif
4

1 回答 1

2

如果您希望提供一个接口并隐藏所有实现细节,您最好定义一个Networker对用户可见的纯虚拟类(例如,在.h-file中),并在后代类中编写实现(例如NetworkerImpl)这对用户不可见。然后,您可以在头文件中声明一个函数(甚至是Networker类的静态方法)Networker *CreateNetworker();(因此该声明对用户可见),然后在.cc文件中与您的 NetworkerImpl 一起实现该函数(这样实现不是对用户可见)喜欢return new NetworkerImpl();

于 2013-05-08T22:09:03.403 回答