我在一个类中定义了一个结构。其中一个成员是具有给定大小的数组。
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’
答案 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;