5

是否可以将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

4 回答 4

8

您必须使您的课程Router成为模板课程

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

...
}

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

否则你需要std::vector.

于 2012-10-27T19:08:03.750 回答
4

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

class Router{
    std::vector<Port> ports;
public:
    Switch(int numberOfPortsOnRouter) : ports(numberOfPortsOnRouter) {
    }
};
于 2012-10-27T19:07:37.727 回答
3

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

于 2012-10-27T19:12:27.370 回答
2

std::array是一个固定长度的数组。因此,长度必须在编译时知道。如果你需要一个动态长度的数组,你想std::vector改用:

class Router{
    std::vector<Port> ports;
public:
    Switch(int numberOfPortsOnRouter):ports(numberOfPortsOnRouter){}
};
于 2012-10-27T19:08:17.013 回答