我有一个Message
类,其中包含消息可以包含的所有可能元素:
class Message {
int msg_id;
int msg_length;
char *username;
char *password;
char *usr_list;
char *to;
char *from;
char *grp_name;
int digit_1;
int digit_2;
char *msg;
};
但是不同的消息类型具有不同的主体元素,并且使其中的对象消耗大量内存。例如,我的程序收到以下数据:
Msg -> (1, name, password)
当程序读取1
时,它会创建一个Message
对象,设置其名称和密码并将其转发给另一个类。现在剩下的属性都是空的并且未使用但仍占用内存。
我该如何解决这个问题?
更新 在这种情况下,访客模式是否会帮助我,我不确定是否会针对此类问题。
答案 0 :(得分:6)
由于Basile的答案在全球意义上是正确的,我认为重要的是陈述以下内容。
如果您尝试实施通信协议,我建议您使用常用的数据序列化库。
这些库允许您轻松声明通信协议,它们包括对此类功能的支持等,并且受到许多不同语言的支持。
可以找到完整的选项列表here。
我过去成功使用过这些:
答案 1 :(得分:3)
了解tagged union或和类型。了解如何使用union types,特别是关注rule of five和/或使用std::variant。也许您需要placement new显式调用析构函数。首选smart pointers(另请参阅this)至原始版本(以及std::string
至char*
)。使用enum
s(甚至enum class
es)代替有界ID。熟悉containers。
你也可以尝试定义一些类层次结构,以便有几类消息......
在编码前花一周时间阅读一些好的book on C++ programming。
答案 2 :(得分:3)
您可以利用C ++的继承和多态性。
根据属性对不同的消息类型进行分类,并创建类层次结构来表示它们。
class Message
{
public:
// virtual methods to process the message
private:
// Attributes common to all the messages
};
class MessageType1: public Message
{
public:
// Methods to process the message
private:
//Attributes specific to Type1 messages
};
class MessageType2: public Message
{
public:
// Methods to process the message
private:
//Attributes specific to Type2 messages
};
创建消息对象 - 您可以实现一个帮助创建不同messageType对象的工厂
class MessageFactory
{
// Method to create MessageType1 object
// Method to create MessageType2 object
};
存储消息对象 - 您可以使用容器来使用标准库API存储和迭代不同的消息对象。
std::vector<Message*> msgVect; // Can hold the derived class object pointers
处理消息 - 您可以使用单个循环对所有存储的对象执行操作。
for (auto msg: msgVect)
{
// msg is pointer to the derived class objects stored earlier.
// You can invoke a method here to perform operations on the
// object.
}
答案 3 :(得分:0)
我会尝试使用Constructor Overloading.Constructor可以像函数重载一样重载。
重载的构造函数具有相同的名称(类的名称),但参数的数量不同。
根据传递的参数的数量和类型,调用特定的构造函数。