在使用它的类的构造函数中初始化std :: array的大小

时间:2012-10-27 19:03:58

标签: c++ arrays templates c++11 std

是否可以将std::array<class T, std::size_t N>用作类的私有属性,但在类的构造函数中初始化其大小?

class Router{
    std::array<Port,???> ports; //I dont know how much ports do will this have
public:
    Switch(int numberOfPortsOnRouter){
        ports=std::array<Port,numberOfPortsOnRouter> ports; //now I know it has "numberOfPortsOnRouter" ports, but howto tell the "ports" variable?
    }
}

我可能会使用指针,但如果没有它可以这样做吗?

4 个答案:

答案 0 :(得分:6)

您必须使您的班级Router成为模板类

template<std::size_t N> 
class Router{
    std::array<Port,N> ports; 

...
}

如果您希望能够在ports 指定Router的大小。顺便说一句,N必须是编译时已知的常量。

否则您需要std::vector

答案 1 :(得分:4)

不,必须在编译时知道大小。请改用std::vector

class Router{
    std::vector<Port> ports;
public:
    Switch(int numberOfPortsOnRouter) : ports(numberOfPortsOnRouter) {
    }
};

答案 2 :(得分:3)

std::array<T, N>的大小是编译时常量,在运行时无法更改。如果您想要一个具有灵活边界的数组,您可以使用std::vector<T>。如果数组的大小没有改变,并且您以某种方式知道其上下文的大小,则可以考虑使用std::unique_ptr<T[]>。它的重量更轻,但也无助于复制或调整大小。

答案 3 :(得分:2)

std::array是一个固定长度的数组。因此,必须在编译时知道长度。如果您需要具有动态长度的数组,则需要使用std::vector代替:

class Router{
    std::vector<Port> ports;
public:
    Switch(int numberOfPortsOnRouter):ports(numberOfPortsOnRouter){}
};