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

のサイズは、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 に答える