嵌入式C ++:类中结构的数组成员的初始化,省略了大小

时间:2011-03-30 12:57:45

标签: c++

您好,并提前感谢您对以下事项的任何帮助。

编辑:我忘了补充一点,这是在嵌入式系统上,无法访问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 }

没有任何运气。我对C ++比较陌生,所以这个让我难过。 我可以在StructA中为数组成员添加一个大小,但我宁愿不这样做 有合法的方法来解决这个问题。

谢谢!

4 个答案:

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