【问题标题】:defining a fixed size array in a struct在结构中定义固定大小的数组
【发布时间】:2012-10-31 12:45:33
【问题描述】:

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

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’

【问题讨论】:

  • 这根本不是一个固定大小的数组。

标签: c++ arrays struct static-members


【解决方案1】:

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

【讨论】:

  • pattern 是一个位向量。假设00000。然后我想使用en.pc 将其中一个设置为 .所以01000。使用向量,我必须 push_back
  • @mahmood 你不必使用向量 push_back。此外,您可以改用std::bitset&lt;N&gt;
  • 仍在使用std::bitset 我必须定义一个static const int N=5;
  • @mahmood 是的,这是真的。然后是 std::vector。您可以使用N 条目创建一个向量,然后使用operator[],就像它是一个数组一样。没有push_back,没有重新分配。
【解决方案2】:

N 大小必须在编译时知道。如果你像static const int N=5 一样输入,它将编译。

【讨论】:

  • 我更正了这一点,以便在课堂上使用。我通常在堆栈上使用固定大小的数组来执行一些侧面操作。我从来没有用它作为班级成员。
【解决方案3】:

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

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

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

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

或者,类似地,使用std::array,如std::array&lt;bool,10&gt; vals;

【讨论】:

    【解决方案4】:

    在大多数情况下,使用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;
    

    【讨论】:

      【解决方案5】:

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

      要么使用const int N=5;,要么使用N作为类变量static int foo::N=6;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-06-07
        • 1970-01-01
        • 1970-01-01
        • 2012-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多