我有一个消息类,我决定使用构建器设计模式。每条消息在完全构建后看起来非常相似。我使用 astd::string
来保存信息(它实际上只是独立的字符,所以我可以使用vector<char>
但.c_str()
很方便。
每个不同的消息子类型的构造方法都是相同的(构建标题,构建货物,构建页脚,计算校验和......这是在MessageBuilder
类中定义的(并继承到自定义消息构建器类):
class MessageBuilder
{
public:
// implementation details for all messages
static const int32 MsgDelimeter = 99;
// ...
Message getMsg();
void buildMessage();
protected:
MessageBuilder(uint8 msgID, uint8 cargoLen, uint8 csi, const uint8* cargo, const uint8 length)
: m_msgID(msgID), m_cargoLen(cargoLen), m_csi(csi),
m_cargo(cargo), m_contents(""), m_msg(m_contents)
{ }
// I previously tried passing cargo and length as just a std::string
// if I could get that to work it would also be fine
void buildHeader();
void buildCargo();
void buildFooter();
void resizeContents();
void calculateCheckSum();
// message is built in m_contents
Message::string m_contents;
Message::string m_cargo;
Message m_msg;
// variables specific to msg type
uint8 m_msgID;
uint8 m_cargoLen;
uint8 m_csi;
private:
};
然后构建一个特定的消息,我有一个特定的类:
class CustomMessageABuilder : public MessageBuilder
{
public:
static const uint8 CustomMessageAID = 187;
// more details
// ...
// what I want to do
// static const uint8 CustomMessageACargo[4] = {0x65, 0xc7, 0xb4, 0x45};
// ** HERE **
CustomMessageABuilder ()
: MessageBuilder(CustomMessageAID,
CustomMessage1CargoLen,
//...
CustomMessageACargo,
CustomMessageALength
{ }
};
无论如何,我想做的是将唯一的自定义字符串,货物,从CustomMessageABuilder
构造函数传递到MessageBuilder
类,它将存储在消息的中间。
每条消息的货物都不同,但以相同的方式存储,因此用于存储货物/创建货物的所有逻辑都在基MessageBuilder
类中。所有的差异,如 msgID、cargoLen、cargo ……都是CustomMessageBuilder
类中的常量。
这将使我的消息类保持非常简单:
class Message
{
public:
typedef std::string string;
// ctor
Message(string);
// dtor
~Message();
// copy ctor
Message(const Message&);
// assignment operator
Message& operator=(const Message&);
// getters
uint8 getLength() const;
const string& getData() const;
const uint8* getCSTR() const;
// setters
void setData(const string&);
protected:
// ctor
Message() : m_contents("") { }
// contents of entire message
string m_contents;
};
所以我想这一切都归结为:
为一个类定义一个字符/十六进制值(每个消息货物)的常量数组的最佳方法是什么(并且仍然能够在构造函数的初始化列表中传递它)?或者,告诉我我缺少的明显方法。
注意:对于其他消息类,货物将是动态内容,但始终是固定长度。
注2:我最终将拥有一个拥有 aCustomMessageBuilder()
并告诉它的 director 类buildMessage()
。
任何帮助、建议、批评等将不胜感激。