我正在尝试在我的 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