2015-02-23 82 views
0

我想单元测试我正在构建的C++应用程序,并且在类中使用时遇到初始化数组的问题。我已经尝试了很多加载这些信息的不同方法,只有那些工作效率低下/不适合。类中的char数组初始化

这里是十六进制阵列,我(随机的部分)

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

这是我最新的尝试失败,它说compilcation在其无效的,如我所料,但在这一点上,我是想什么。

我也试过类似的东西(所有设置功能)

firstMessage << "\0x24\0x54\0x3b\0x72\0x8b\0x03\0x24\0x29\0x23\0x43\0x66\0x22\0x53\0x41\0x11\0x62\0x10"; 

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

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

我明白这样做会有一个简单而适当的方法,并考虑应用程序的实际作用,这部分应该是最简单的。

回答

1

您有几种选择:使用语法构造MesssageParsingTest

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

申报量静态成员在类定义的.h:在.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 unsigned char kFirstMessage[]; 

,并定义+初始化它,我宁愿静态常量成员,如果你不打算以后再修改这个数组,因为它使意图更清晰。

+0

我试图方法1。首先,当我向编译器选项添加'-std = C++ 0x'时,它工作正常,但选项2从来没有工作,但似乎更具吸引力,我是否正确地在头文件中的类定义中添加此行? – Scriptable 2015-02-23 15:54:18

+0

请参阅编辑,我详细的语法。 – 2015-02-23 16:01:35

+0

@llya感谢您的帮助。但是当我在构造函数中通过'const unsigned char MessageParsingTest :: kFirstMessage [] = ...'方法得到错误时,这个静态方法会告诉我错误:函数内部不允许定义或重新声明kFirstMessage。我喜欢在C \ C++中工作,但有时候最简单的事情可能是一种正确的痛苦! – Scriptable 2015-02-23 16:20:07

0

您可以使用一个临时缓冲区,然后复制到您成员,因为这:

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

下面是做到这一点的方法之一。

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}, 
    ... 
+0

谢谢你,你的第二种方法和对c + + 11的参考工作。我将尝试下面的静态常量方法,因为我认为这会更合适 – Scriptable 2015-02-23 15:55:30