基本的なゲーム エンジンでネットワーク部分を C++ で開発しようとしていますが、かなり奇妙な問題に直面しています (それは私にとって問題です)。
ソケット (UDP) のセットアップを処理する Singleton Networker クラスを取得し、クライアントがサーバーに提供したユーザー名を登録しようとし、ユーザー名が別のプレイヤーによって既に使用されているかどうかを表すブール値を返します。クラス自体はパケット自体を処理しません。そのために Packethandler クラスを使用することを目指しています。
問題は、クライアントが PacketHandler を直接作成できるようにしたくないということです。なぜなら、Networker クラスの全体的なポイントは、それを処理するための何らかのインターフェースを提供することだからです。私が持っていた最初のアイデアは、「Packethandler のコンストラクターをプライベートにしてシングルトンを作成する」ことでしたが、もちろん、クライアントは引き続きインスタンスを要求できます。次に、「十分に保護されている」とすぐに考えましたが、Networker は PacketHandler を拡張していません。それで、「さて、Networker を PacketHandler のフレンドにしましょう」と考えました。しかし、これまでに見つけたすべての情報はフレンドの使用を思いとどまらせているように見えるので、疑問に思います: 単純なネットワーク部分の私の計画に欠陥があり、このような問題に直面しているのでしょうか、それとも私の問題がそもそもフレンド機能が存在する理由なのでしょうか? これについて皆さんはどう思いますか?
編集:私のアイデアのコード。
Packethandler.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
Networker.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