类中的字符数组初始化

Char array initialisation in class

本文关键字:数组 初始化 字符      更新时间:2023-10-16

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

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

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]; 
};

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

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

正如我所料,这是我最近一次失败的尝试,它说在编译期间无效,但在这一点上,我正在尝试任何东西。

我也尝试过类似(全部在设置功能中)的东西

firstMessage << "x24x54x3bx72x8bx03x24x29x23x43x66x22x53x41x11x62x10";
firstMessage[1500] = "x24x54x3bx72x8bx03x24x29x23x43x66x22x53x41x11x62x10";

以及其他一些疯狂的方法,有人知道加载这些数据的正确方法吗?到目前为止,我让它工作的唯一方法是要么没有数据成员声明,直接定义它并在一行中初始化(但在测试用例中我无法访问),要么像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静态成员

static const unsigned char kFirstMessage[];

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

const unsigned char MessageParsingTest::kFirstMessage[] = "x24x54x3bx72x8bx03x24x29x23x43x66x22x53x41x11x62x10";

如果以后不打算修改此数组,我更喜欢静态const成员,因为它可以使意图更清晰。

这里有一种方法。

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,您也可以将类成员初始化列表中的firstMessage初始化为

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

您可以使用临时缓冲区,然后复制到您的成员中,如下所示:

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);
}