我有一个消息类,我决定使用构建器设计模式。完全构建时,每条消息看起来非常相似。我使用std::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:我最终将拥有一个导演课程,该课程将拥有CustomMessageBuilder()
并告诉buildMessage()
。
任何帮助,建议,批评等都会受到高度赞赏。
答案 0 :(得分:1)
静态const成员可以在类之外初始化。
#include <iostream>
class A
{
public:
static const char cargo[4];
};
const char A::cargo[4] = {0x65, 0xc7, 0xb4, 0x45};
int main()
{
std::cout << A::cargo[0] << A::cargo[1] << A::cargo[2] << A::cargo[3] << std::endl;
}