您好,并提前感谢您对以下事项的任何帮助。
编辑:我忘了补充一点,这是在嵌入式系统上,无法访问STL功能。我很抱歉将这条非常重要的信息丢弃了。这是我第一次在C ++中进行广泛编码,所以我忘了提到这一点。我回来补充这个事实,这个问题已经收到了一些回复。谢谢大家这么快的回复!
我正在尝试初始化一个结构的数组成员,而该结构又是C ++类的公共成员。结构中省略了数组大小。这是一个例子:
// ClassA.h
Class A
{
public:
struct StructA
{
StructB structs[];
};
struct StructB
{
// stuff
};
ClassA();
//etc
};
// ClassB.h
ClassB: public ClassA
{
public:
StructA structA;
ClassB()
// etc
};
// ClassB.cpp
// What do I do here?
我试过了:
StructA ClassB::structA.structs[] = { first, second, third }
谢谢!
答案 0 :(得分:7)
没有大小的数组无效C ++;它们是C99中的一个功能,它需要一些malloc
魔法才能运行。如果您尝试使用g++ -pedantic
的此功能编译代码,您会看到它发出:
$ g++ -Wall -pedantic test.cc
test.cc:5: error: ISO C++ forbids zero-size array 'foo'
我建议您使用std::vector
代替,它与C99中的未大小数组具有相同的功能,但更安全:
std::vector<StructB> structs;
然后使用push_back
添加元素。
答案 1 :(得分:2)
因为你无论如何用c ++编码,为什么不使用:
std::vector<structA> mStruct;
...
mStruct.push_back(first);
...
std :: vectors与c-array比较安静,不易出错。
答案 2 :(得分:1)
一般来说,很难在C或C ++中创建具有可变大小的东西,而不需要动态分配,在使用嵌入式系统时应该尽量避免使用。
我建议你创建一个简单的数组,并在你的类中放置一个指针。您可以将数组放在全局范围内,指针不必知道它的大小。
此外,通过简单地将某些东西放在一个类中并不会使它成为全局的。您必须使其成为static
成员(意味着将只有一个变量,无论该特定类有多少个对象),或者在构造函数中初始化它。
例如:
class A
{
public:
struct B
{
char const * str;
};
// Constructor
A(A::B * beePointer)
: mB(beePointer)
{
}
// Data members
B * mB;
};
// Global array
A::B my_Bees[] = {"first", "second", "third"};
A my_a(my_Bees);
当然,在这个解决方案中,你不能在数组末尾添加更多元素,因为它是一劳永逸地分配的。
答案 3 :(得分:1)
你不能在C ++中使用unsized数组。由于您无权访问vector
:
new
/ delete
,但如果默认值不够高,则可能需要创建自己的内存池。静态看起来的样本:
// ClassA.h
class ClassA
{
public:
struct StructB
{
// stuff
};
struct StructA
{
static StructB structs[];
};
ClassA();
//etc
};
// ClassB.h
class ClassB: public ClassA
{
public:
StructA structA;
ClassB() { }
// etc
};
// ClassB.cpp
ClassA::StructB first, second, third;
// What do I do here?
ClassA::StructB ClassA::StructA::structs[] = { first, second, third };
int main()
{
return 0;
}