class 中的字符数组初始化

Char array initialisation in class

我正在尝试对正在构建的 C++ 应用程序进行单元测试,但在 class 中使用时初始化数组时遇到问题。我已经尝试了很多不同的方法来加载这些信息,唯一有效的方法效率低下/不合适。

这是我的十六进制数组(部分随机化)

0x24,0x54,0x3b,0x72,0x8b,0x03,0x24,0x29,0x23,0x43,0x66,0x22,0x53,0x41,0x11,0x62,0x10

我的单元测试的头文件:

class MessageParsingTest : public CPPUNIT_NS::TestFixture {
    CPPUNIT_TEST_SUITE(MessageParsingTest);

    CPPUNIT_TEST(testIdentifyFirstMessageType);

    CPPUNIT_TEST_SUITE_END();

public:
    MessageParsingTest();
    virtual ~MessageParsingTest();
    void setUp();
    void tearDown();

private:
    void testIdentifyFirstMessageType();
    void testIdentifySecondMessageType();

    // data members for the hex array
    unsigned char firstMessage[1500]; 
};

然后在我的测试用例setUp函数中;

void MessageParsingTest::setUp() {
    firstMessage = {0x24,0x54,0x3b,0x72,0x8b,0x03,0x24,0x29,0x23,0x43,0x66,0x22,0x53,0x41,0x11,0x62,0x10};
}

这是我最近一次失败的尝试,它说它在编译期间无效,正如我所料,但此时我正在尝试任何事情。

我也尝试过类似的东西(都在 setUp 函数中)

firstMessage << "[=14=]x24[=14=]x54[=14=]x3b[=14=]x72[=14=]x8b[=14=]x03[=14=]x24[=14=]x29[=14=]x23[=14=]x43[=14=]x66[=14=]x22[=14=]x53[=14=]x41[=14=]x11[=14=]x62[=14=]x10";

firstMessage[1500] = "[=14=]x24[=14=]x54[=14=]x3b[=14=]x72[=14=]x8b[=14=]x03[=14=]x24[=14=]x29[=14=]x23[=14=]x43[=14=]x66[=14=]x22[=14=]x53[=14=]x41[=14=]x11[=14=]x62[=14=]x10";

和其他一些疯狂的方法,有谁知道加载这些数据的正确方法吗?到目前为止我让它工作的唯一方法是没有数据成员声明并直接定义它并在一行中初始化(但后来我无法在测试用例中访问)或者一个一个地做它 firstMessage[0] = 0x24;

我知道会有一个简单、正确的方法来做这件事,考虑到应用程序的实际作用,这部分应该是最简单的。

你有几个选择:

  1. 使用语法在构造函数 MesssageParsingTest 中初始化数组:firstMessage{0x24,0x54,0x3b,0x72,0x8b,0x03,0x24,0x29,0x23,0x43,0x66,0x22,0x53,0x41,0x11,0x62,0x10} 在初始化列表中。
  2. 创建包含您的消息的静态常量数组,然后使用 memcpy 将其复制到成员变量,或者使用静态成员并删除 firstMessage 成员变量。

在.h里面声明const静态成员class定义:

static const unsigned char kFirstMessage[];

并在 .ccp 中定义并初始化它

const unsigned char MessageParsingTest::kFirstMessage[] = "[=11=]x24[=11=]x54[=11=]x3b[=11=]x72[=11=]x8b[=11=]x03[=11=]x24[=11=]x29[=11=]x23[=11=]x43[=11=]x66[=11=]x22[=11=]x53[=11=]x41[=11=]x11[=11=]x62[=11=]x10";

如果你以后不打算修改这个数组,我更喜欢静态常量成员,因为它使意图更清晰。

您可以使用临时缓冲区,然后像这样复制到您的成员中:

void MessageParsingTest::setUp() {
    unsigned char tmp[1500] = {0x24,0x54,0x3b,0x72,0x8b,0x03,0x24,0x29,0x23,0x43,0x66,0x22,0x53,0x41,0x11,0x62,0x10};
    memcpy(firstMessage, tmp, 1500);
}

这是一种方法。

void MessageParsingTest::setUp()
{
    unsigned char x[] = {0x24,0x54,0x3b,0x72,0x8b,0x03,0x24,0x29,0x23,0x43,0x66,0x22,0x53,0x41,0x11,0x62,0x10};
    ::memcpy(firstMessage, x, sizeof(x));
}

如果你使用的是C++11,也可以将class成员初始化列表中的firstMessage初始化为

MessageParsingTest::MessageParsingTest() : 
   firstMessage{0x24,0x54,0x3b,0x72,0x8b,0x03,0x24,0x29,0x23,0x43,0x66,0x22,0x53,0x41,0x11,0x62,0x10},
   ...