我正在为我正在编写的嵌入式应用程序创建一些初始化数据结构,但仍处于设计阶段,想知道如何初始化各种数据结构。
在下面的示例中,数组的大小永远不会改变,但内容将在运行时期间发生。
其中一个数据结构如下:
int id;
int type;
unsigned char data[x]
所以例如(用C表示法)
{4,1,{1,2,3,4,5,6,7,8}}
{2,0,{4,2,1}}
{3,2,{9,1,2,9,2}}
etc.. (about 20 other lines)
在运行应用程序期间,上述数组的长度永远不会改变,但内容将会改变。
所以我想到了一个模板化的课程:
template<int N>
class ds
{
public: // aggregate class for easy initialisation
int id;
int type;
unsigned char elements[N];
static int size() { return N; }
};
那么你可以这样做:
ds<8> v1 = {4,1,{1,2,3,4,5,6,7,8}}
问题:如果没有这些方法被模板化,这也很容易传递给方法,并且会产生太多代码膨胀 - 为每个唯一大小创建方法的副本。我可以通过将它转换为类似的结构并使用&#34; int元素[1]&#34;来解决这个问题。得到数据,但后来我不知道大小,这似乎也是一种讨厌的方式。
我宁愿没有像&#34; doSomething(v1.id,v1.type,v1.elements,v1.size)这样的函数调用;
所以我已经退回到旧的做事方式,这似乎有用:
struct foo
{
int id;
int type;
unsigned char *data;
int size;
};
unsigned char data[] = {1,2,3,4,5,6,7,8};
foo bar = {4,1,data,sizeof(data)/sizeof(data[0])};
哪个有效,我可以绕过&foo foo&#39;结构到我选择的任何方法。
但它有一种更友好的C ++方式吗? 也许是一种无需拥有数据的方法。和&#39; bar&#39;作为两个独立的变量?
答案 0 :(得分:0)
某些编译器接受字段名称说明符初始化:
foo bar =
{
.id = 4,
.type = 1,
.data = {1,2,3,4,5,6,7,8},
.size = sizeof(data) / sizeof(data[0]),
};
不幸的是,Visual Studio 2010仍然不允许这种语法。
如果数据是常量,您可能希望将变量作为static const
加前缀。这将允许链接器/编译器将数据放入只读部分。
答案 1 :(得分:0)
如果您的编译器支持C ++ 11,则可以在类成员初始化中使用。请参阅以下代码:
#include <iostream>
struct foo
{
int size = 3;
int id = 1;
int type = 2;
unsigned char data[3] = {'1', '2', '3'};
};
int main()
{
foo a;
std::cout << "a.id = " << a.id << std::endl;
std::cout << "a.size = " << a.size << std::endl;
std::cout << "a.type = " << a.type << std::endl;
std::cout << "data[0] = " << a.data[0] << std::endl;
std::cout << "data[1] = " << a.data[1] << std::endl;
std::cout << "data[2] = " << a.data[2] << std::endl;
return 0;
}
但是请注意,初始化不是在编译期间完成的,而是在声明变量a
并且引发其构造函数的运行时。
我无法看到如何在编译期间初始化成员变量(即一块内存),因为它不是静态的(即,在编译时无法初始化常规成员变量)。
答案 2 :(得分:0)
是否有声明表明您需要创建固定大小的数据结构?我知道你说大小永远不会改变所以为什么不使用vector<unsigned char>
?或者你可以将C与C ++混合,并为结构创建一个构造函数,用于分配数组并复制项目,例如:
struct foo
{
foo(int size, char* in_data) {
data = new char[size];
memcpy(data, in_data, size * sizeof(char));
}
int id;
int type;
unsigned char *data;
int size;
};