繁体   English   中英

针对此客户端/服务器情况(C ++),在一个标头文件中包含许多结构

[英]Many structs in one header file for this client/server situation (C++)

我正在尝试确定这是否不是很好。 基本上,我正在编写客户端服务器系统。 为了简化和减少错误,我决定了所有请求/响应/等。 客户端和服务器之间的关系应该定义为客户端和服务器都使用的共享库中的结构,然后具有一个序列化层,该序列层知道如何序列化结构(两者再次使用)。

例如:

共享库:

requestparamstructs.h

#ifndef REQUEST_PARAMS_H
#define REQUEST_PARAMS_H

struct CreateUserRequestParams
{
    std::string name;
    std::string address;
    std::string username;
    int age;
    ..
    ..
};

struct CreateItemRequestParams
{
    std::string name;
    std::string description;   
};

..
..

#endif

然后在我客户的某个地方:

client.h

CreateUserRequestParams p;
p.name = "Foo";
p.address = "Somewhere";
p.username = "mrfoo";

Request<CreateUserRequestParams> myRequest(p);

client.queueRequest(myRequest);

然后,服务器接收到请求,使用工厂创建适当的结构,然后反序列化并执行所需要做的任何事情。

现在,最初我将每个结构放在一个单独的文件中,但这似乎有点过头了。

这样将这些结构放在单个标头中是否会抽搐? 我猜唯一缺少的是默认的构造函数来初始化变量,这将使它更多地成为类,然后感觉应该是单独的文件。

请记住,我将需要创建许多此类文件。

谢谢!

编辑:

1)为了澄清,这是一个通过TCP / IP进行通信的客户端服务器系统。 没有共享内存涉及。 “共享库”只是在.lib文件中共享并链接的代码。客户端和服务器都可以使用的所有通用代码都放在这里。

2)我认为,参数化模板会很棒,很遗憾,VS2010不支持可变参数模板。 有一次我在想这样的事情:

template <Protocol::ClientRequest RequestCode, typename P1>
class RequestP1 : public Request
{
public:
    RequestP1() : Request(RequestCode) {}
    RequestP1(P1 p1) : Request(RequestCode), m_p1(p1) {}
    virtual void serialize(IArchive &ar)
    {
        serialize(ar, m_p1);
    }
    P1 m_p1;
};

template <Protocol::ClientRequest RequestCode, typename P1, typename P2>
class RequestP2 : public Request
{
public:
    RequestP2() : Request(RequestCode) {}
    RequestP2(P1 p1, P2 p2) : Request(RequestCode), m_p1(p1), m_p2(p2) {}
    virtual void serialize(IArchive &ar)
    {
        serialize(ar, m_p1);
        serialize(ar, m_p2);
    }
    P1 m_p1;
    P2 m_p2;
};

..
..

这将使我能够做到这一点:

typedef RequestP1<Protocol::CreateUser, CreateUserRequestParams> RequestCreateUser;

OR specifying the actual params (just showing the first two params here, name and address):

typedef RequestP1<Protocol::CreateUser, std::string, std::string> RequestCreateUser;

希望有道理..

这样将这些结构放在单个标头中是否会抽搐?

没有。

假设您的服务器和客户端都使用了大多数(如果不是全部)请求(因此, *Params对象被同时使用),那么让我考虑将它们放入单独文件中的唯一一件事就是它们的类型。领域。

只要您的参数对象只有基本类型或常见类型(如std::string ,我就很好。 但是,如果您碰巧引入了一条消息,该消息使用的是标准库中未定义的类型(例如QtQPixmap等),我会考虑将该消息(以及其他具有相同依赖项的消息)移动到单独的文件中因此只有那些需要使用这些参数的客户端才需要引入依赖项。 我怀疑这在您的情况下不太可能,因此将所有Param结构放入一个文件中是很好的恕我直言。

但是,如果事实证明不同客户端使用的* Param对象集存在巨大差异,我会考虑将相关组放入单独的文件中以减少编译时的依赖性。 否则,将新的Param类型添加到组中意味着重新编译所有客户端-甚至那些不使用相应消息的客户端。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM