变量类数组

时间:2012-08-01 19:07:04

标签: c++

我有以下数据包布局:

struct PacketLayout
{
  int GateCode;
  BYTE StringLen;
  char String[StringLen];
  BYTE ServerStatus;
  BYTE ServerStorage;
  BYTE ServerNumber;
}

课程是这样的:

class ServerInfo
{
  short PacketSize;   //Size of the whole packet
  BYTE TotalServers; //total of PacketLayout structs
  PacketLayout Server[TotalServers];
  int GlobalSecCode;
  short EncryptedPacketSize; //Same as the first member, just xored
}

所以我遇到的问题是在类或结构中创建一个可变大小的数组,其大小取决于 BYTE StringLen (对于struct)和 BYTE TotalServers 指向的最后一个成员strong>(对于班级)。

我不知道解决这个问题的方法是什么,也许可以实现一个模板?如果是这样我可以看到一个例子(我还不熟悉模板)我还想引用我的成员名而不计算指针我自己的位置(正如我现在所做的那样)。

感谢。

3 个答案:

答案 0 :(得分:2)

可以使用模板执行此操作,例如:

template <int StringSize>
struct PacketLayout
{
  int GateCode;
  BYTE StringLen;
  char String[StringSize];
  BYTE ServerStatus;
  BYTE ServerStorage;
  BYTE ServerNumber;
};

允许您将其用作:

PacketLayout<100> pkt;

通常情况下,你想做的事情比较简单。例如,如果您重新排序数据包并知道大小的上限,则可以执行以下操作:

struct PacketLayout
{
  int GateCode;
  BYTE StringLen;
  BYTE ServerStatus;
  BYTE ServerStorage;
  BYTE ServerNumber;
  char String[MAX_POSSIBLE_SIZE];
};

或者:

struct PacketLayout
{
  int GateCode;
  BYTE StringLen;
  BYTE ServerStatus;
  BYTE ServerStorage;
  BYTE ServerNumber;
  char *String;
};

并在阅读期间分配/设置String

就个人而言,我会跳过所有这些凌乱的低级别细节,并使用类似protobuf之类的东西来为您完成工作,让您自由地专注于为您的项目增加价值的更重要的更高层次的事情。

有时候也会使用一种常见但很脏的技巧:

struct PacketLayout
{
  int GateCode;
  BYTE StringLen;
  BYTE ServerStatus;
  BYTE ServerStorage;
  BYTE ServerNumber;
  char String[1];
};

当人们将末尾的变量部分的大小定义为1然后故意分配比结构所需的更多的内存,这样他们就可以写出它的结尾。这是邪恶的,但不推荐。

答案 1 :(得分:0)

使用模板绝对是可行的方法:

template <size_t TotalServers>
class ServerInfo 
{
    PacketLayout Server[TotalServers];
    int GlobalSecCode;
};

这样做的缺点是没有一个ServerInfo可以分配给另一个,所以可能使用std::vector很重要,如果这对你意义重大。

答案 2 :(得分:0)

在C ++中没有很好的方法来实现这一点。

这是在PacketLayout中创建可变大小数组的方法:

struct PacketLayout
{
  int GateCode;
  BYTE StringLen;
  BYTE ServerStatus;
  BYTE ServerStorage;
  BYTE ServerNumber;
  char String[1];
}

然后你分配一个实例:

PacketLayout* createPacketLayout(BYTE stringLen)
{
    PacketLayout* packetLayout = (PacketLayout*)new char[sizeof(PacketLayout) - 1 + stringLen];
    packetLayout->StringLen = stringLen;
    return packetLayout;
}

在这种情况下,ServerInfo可以包含指针数组。