如何通过构造函数确定私有std :: array成员的大小?

Aga*_*nju -1 c++ arrays constructor

我有一个class B应该包含一个private std::array<A*>,并且大小将通过构造函数发送

class B
{
  public:
    B(size_t s) : vv(s,nullptr), aa(s) {}
    // ... more stuff
  private:
    std::vector<A*>   vv;   // vector works fine
    std::array<A*,??> aa;   // but how to initialize an array??
}
Run Code Online (Sandbox Code Playgroud)

使用std::vector可以很好地工作,但是似乎无法使用它std::array

添加另一个成员const size_t ss并在std::array声明中使用它也不起作用,即使它是static const size_t ss-编译器(VS2019 16.1.5,设置为C ++ 17)声称“ ...期望的编译时常量...”

class B  // another try with a static const size_t
{
  public:
    B(size_t s) : ss(s), aa(s) {}
    // ... more stuff
  private:
    static const size_t ss;
    std::array<A*,ss> aa;   // no, ...expected compile-time constant...
}
Run Code Online (Sandbox Code Playgroud)

该消息似乎暗示没有办法 -如果需要在编译时知道大小,则该类的所有实例/对象的大小都必须相同 -这直接与我的计划相矛盾。

当然,我可以创建一个模板类,或者我可以简单地停留在std::vector;上。或者我可以使用一种“ PIMPL”(相反,声明一个指向该数组的指针,并new在构造函数中使用它创建)-这不是问题。

问题是:我可以在构造函数中传递待定数组的大小,然后直接从中创建它吗?
是否有任何花哨的构造或技巧?

[注:不是的副本在构造函数初始化私有的std ::数组成员,或初始化的std ::阵列私有成员通过构造函数,或如何构建的std ::数组对象与初始化列表?-我不想传递,但要传递数组的大小 ]

rob*_*oke 7

你不能 std :: array的大小是在编译时确定的,而不是在运行时确定的。对于运行时存储,请使用std :: vector。与类最接近的是将类声明为模板,如下所示:

template<size_t size>
class Foo {
   std::array<size> member;
};
Run Code Online (Sandbox Code Playgroud)

但是,如果要将大小作为arg传递给构造函数,则需要使用std :: vector。