1

我有一个消息类,我决定使用构建器设计模式。每条消息在完全构建后看起来非常相似。我使用 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()

任何帮助、建议、批评等将不胜感激。

4

1 回答 1

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;
}
于 2013-02-02T06:12:11.147 回答