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

类中的字符数组初始化 我尝试对我正在构建的C++应用程序进行单元测试,在类中使用时,我会初始化一个数组。我尝试过很多不同的方法来加载这些信息,唯一有效的方法是低效/不合适的,c++,arrays,cppunit,C++,Arrays,Cppunit,这是我得到的十六进制数组(随机化部分) 和我的单元测试的头文件: class MessageParsingTest : public CPPUNIT_NS::TestFixture { CPPUNIT_TEST_SUITE(MessageParsingTest); CPPUNIT_TEST(testIdentifyFirstMessageType); CPPUNIT_TEST_SUITE_END(); public: MessageParsingTest()

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

和我的单元测试的头文件:

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您几乎没有选择:

  • 使用以下语法初始化构造函数MessageParsingTest中的数组:
    firstMessage{0x24,0x54,0x3b,0x72,0x8b,0x03,0x24,0x29,0x23,0x43,0x66,0x22,0x53,0x41,0x11,0x62,0x10}
    在初始值设定项列表中
  • 创建包含消息的静态常量数组,并使用memcpy将其复制到成员变量,或者使用static member并除去firstMessage成员变量
  • 在类定义内的.h中声明常量静态成员:

    static const unsigned char kFirstMessage[];
    
    并在.ccp中定义并初始化它

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

    如果您以后不打算修改此数组,我更希望使用static const member,因为它使意图更清晰。

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

    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,还可以将类成员初始化列表中的第一条消息初始化为

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

    我尝试了方法1。首先,当我将
    -std=c++0x
    添加到编译器选项时,它起了作用,选项2虽然从未起作用,但似乎更吸引人,我在头文件的类定义中添加这一行对吗?@llya感谢您的帮助。但是这个静态方法有一个错误,当在构造函数中执行
    const unsigned char MessageParsingTest::kFirstMessage[]=…
    时,它告诉我“错误:函数中不允许定义或重新声明kFirstMessage”。我喜欢在C\C++中工作,但有时最简单的事情可能是一种痛苦!由于这是一个静态类成员,定义必须在函数体之外-与定义类方法的范围相同。谢谢,您的第二个方法和对c++11的引用都起到了作用。我将尝试下面的staticconst方法,因为我认为这样更合适
    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));
    }
    
    MessageParsingTest::MessageParsingTest() : 
       firstMessage{0x24,0x54,0x3b,0x72,0x8b,0x03,0x24,0x29,0x23,0x43,0x66,0x22,0x53,0x41,0x11,0x62,0x10},
       ...