在结构中定义固定大小的数组

时间:2012-10-31 12:45:33

标签: c++ arrays struct static-members

我在一个类中定义了一个结构。其中一个成员是具有给定大小的数组。

class foo {
private:
  int N;
  struct entry {
    uint64_t pc;
    uint64_t offset;
    bool pattern [N];
  };
public:
  void bar()
  {
   entry en;
   en.pc = 1;
   en.offset = 2;
   en.pattern[en.pc] = 1;
  }
};

但错误是

error: invalid use of non-static data member ‘N’

5 个答案:

答案 0 :(得分:3)

C ++不支持可变长度数组。必须在编译时知道N。另一种方法是使用std::vector代替。

class foo {
private:
  int N;
  struct entry {
    uint64_t pc;
    uint64_t offset;
    std::vector<int> pattern;
  };
public:
  void bar()
  {
   N = 100; //don't forget to initialize N
   entry en;
   en.pc = 1;
   en.offset = 2;
   en.pattern.resize(N);
   en.pattern[en.pc] = 1;
  }
};

答案 1 :(得分:2)

必须在编译时知道N大小。如果你像static const int N=5那样进行编译。

答案 2 :(得分:2)

要初始化数组,必须使用编译时已知的整数常量。如果您说static const int N=10;,请说它会有用。

C ++中不允许使用可变长度数组,即在运行时之前不知道大小的数组。

另一种方法是使用模板,例如:

template<int N>
struct my_struct {
    bool vals[N];
};

或者,类似地,使用std::array,如std::array<bool,10> vals;

答案 3 :(得分:1)

在大多数情况下,最好使用std::vector而不是固定长度的数组。在这种情况下,您不知道编译时的大小,但无论如何都不允许。鉴于它是bool的集合,您可能需要考虑一个std::bitset,它比bool

的数组更有效。
template < int S >
class foo {
private:
  int N;
  struct entry {
    uint64_t pc;
    uint64_t offset;
    std::bitset<S> pattern;
  };
public:
  entry en;
  foo()
  {
    en.pc = 1;
    en.offset = 2;
    en.pattern[en.pc] = 1;
  }
};

请注意,我添加了foo构造函数,在切换到bitset的情况下,现在可能会或者可能不会有意义,现在可以按如下方式使用对象:

foo<24> myBits;

答案 4 :(得分:0)

这里N在编译时是未知的。如果你创建一个ob1,ob2,ob3,那么可能有三个对象可能具有不同的N值并且违反c ++定律(可变长度数组)。

使用const int N=5;或将N设为类变量static int foo::N=6;