如何将常量数组传递给构造函数初始化列表

时间:2013-02-02 04:52:59

标签: c++ oop initialization

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

任何帮助,建议,批评等都会受到高度赞赏。

1 个答案:

答案 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;
}