c++ - 向客户端隐藏库内部类 C++ : use friend?

标签 c++ networking friend

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

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

问题是我不希望客户端能够直接创建 PacketHandler,因为 Networker 类的全部意义在于提供某种接口(interface)来处理它。我的第一个想法是“将 Packethandler 的构造函数设为私有(private)并创建一个单例”,但当然客户仍然可以询问该实例。然后我很快虽然“当时保护得很好”但是 Networker 没有扩展 PacketHandler。然后我想‘好吧,让 Networker 成为 PacketHandler 的 friend ’。到目前为止,我发现的所有信息似乎都不鼓励 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

最佳答案

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

关于c++ - 向客户端隐藏库内部类 C++ : use friend?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16450854/

相关文章:

c# - 从 C# 调用我自己的 Java 代码

Java网络游戏: How to list available servers?

c++ - 模板对象的模板友元函数和命名空间

c++ - 为什么友元函数无法访问类的私有(private)成员

c++ - 使用数组的总工资 (C++)

c++ - 如何连接 wxWidgets、GTK2 小部件和 X11 窗口?

c# - 无法使用 System.Diagnostic.Process 运行 nbtstat

networking - 为什么 TCP/IP header 的大小必须是 32 位的倍数?

c++ - 解决模板友元功能的问题

c++ - 模板类的特殊方法?