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 ::数组对象与初始化列表?-我不想传递值,但要传递数组的大小 ]
你不能 std :: array的大小是在编译时确定的,而不是在运行时确定的。对于运行时存储,请使用std :: vector。与类最接近的是将类声明为模板,如下所示:
template<size_t size>
class Foo {
std::array<size> member;
};
Run Code Online (Sandbox Code Playgroud)
但是,如果要将大小作为arg传递给构造函数,则需要使用std :: vector。