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