类中的char数组初始化
我想单元测试我正在构建的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;
一样一个一个地执行。
我明白这样做会有一个简单而适当的方法,并考虑应用程序的实际作用,这部分应该是最简单的。
您有几种选择:使用语法构造MesssageParsingTest
- 初始化数组:
firstMessage{0x24,0x54,0x3b,0x72,0x8b,0x03,0x24,0x29,0x23,0x43,0x66,0x22,0x53,0x41,0x11,0x62,0x10}
在初始化列表。 - 创建包含消息的静态常量数组,或者使用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[];
,并定义+初始化它,我宁愿静态常量成员,如果你不打算以后再修改这个数组,因为它使意图更清晰。
您可以使用一个临时缓冲区,然后复制到您成员,因为这:
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,也可以在初始化类成员初始化列表中firstMessage作为
MessageParsingTest::MessageParsingTest() :
firstMessage{0x24,0x54,0x3b,0x72,0x8b,0x03,0x24,0x29,0x23,0x43,0x66,0x22,0x53,0x41,0x11,0x62,0x10},
...
谢谢你,你的第二种方法和对c + + 11的参考工作。我将尝试下面的静态常量方法,因为我认为这会更合适 – Scriptable 2015-02-23 15:55:30
我试图方法1。首先,当我向编译器选项添加'-std = C++ 0x'时,它工作正常,但选项2从来没有工作,但似乎更具吸引力,我是否正确地在头文件中的类定义中添加此行? – Scriptable 2015-02-23 15:54:18
请参阅编辑,我详细的语法。 – 2015-02-23 16:01:35
@llya感谢您的帮助。但是当我在构造函数中通过'const unsigned char MessageParsingTest :: kFirstMessage [] = ...'方法得到错误时,这个静态方法会告诉我错误:函数内部不允许定义或重新声明kFirstMessage。我喜欢在C \ C++中工作,但有时候最简单的事情可能是一种正确的痛苦! – Scriptable 2015-02-23 16:20:07