类中的字符数组初始化
Char array initialisation in class
我正在尝试对正在构建的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 << " x24 x54 x3b x72 x8b x03 x24 x29 x23 x43 x66 x22 x53 x41 x11 x62 x10";
firstMessage[1500] = " x24 x54 x3b x72 x8b x03 x24 x29 x23 x43 x66 x22 x53 x41 x11 x62 x10";
以及其他一些疯狂的方法,有人知道加载这些数据的正确方法吗?到目前为止,我让它工作的唯一方法是要么没有数据成员声明,直接定义它并在一行中初始化(但在测试用例中我无法访问),要么像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中声明const静态成员
static const unsigned char kFirstMessage[];
并在.ccp 中定义+初始化它
const unsigned char MessageParsingTest::kFirstMessage[] = " x24 x54 x3b x72 x8b x03 x24 x29 x23 x43 x66 x22 x53 x41 x11 x62 x10";
如果以后不打算修改此数组,我更喜欢静态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);
}
相关文章:
- C++使用整数的压缩数组初始化对象
- C++17中函数模板中的静态数组初始化(MSVC 2019)
- 从另一个静态常量数组初始化静态常量数组(只需少量计算)
- 在 Python 和 c++ 2d 数组初始化之间.这是怎麽?为什么呢?
- 字节数组初始化会导致 DirectX 崩溃
- 使用 new 和 值进行数组初始化,但没有显式数量的元素
- 运行时C++数组初始化问题
- 使用带有参数包的数组的成员数组初始化类
- 仅通过C++中数组初始化的不同方法,即可在同一输入上获得两个不同的答案
- C++ 2 个指针数组初始化 C2440
- C++结构字符数组初始化
- C++中的多维数组初始化
- constexpr数组初始化
- C++引物动态数组初始化程序的数目超过大小
- 使用std::index_sequence对std::数组初始化进行包扩展
- 当 std 数组初始化太小时,C++会引发错误吗?
- 如何确定结构数组初始化的大小?
- Qt并发错误:数组初始化需要大括号括起来的初始值设定项列表
- 此代码中的数组初始化样式是什么?这是标准的吗?
- C++ 使用数组初始化时的 STL 向量内存管理