0

コンストラクターの初期化リストで配列を初期化するための新しい C++11 構文をまだ理解していません。私はもはや C++03 で立ち往生していませんが、プログラムの制約のためにブーストまたは std::vector を使用できません。

FOO のインスタンスは、コンストラクター呼び出しによってサイズを設定する必要があり、x と y のサイズが静的にわかっているかのように動作します。新しい C++11 機能はこれを許可しますか?

役立つかどうか、またはどのようにstd::initializer_list<>役立つかはわかりません。

class FOO
{
public:
    // this constructor needs to size x = count and y = count * 4
    FOO(int count) : 
    {
        // interate over x and y to give them their initial and permenent values
    }
private:
    const BAR x[];
    const TAR y[];
};

#include "foo.h"
void main(void)
{
    // both need to work as expected
    FOO alpha(30);
    FOO * bravo = new FOO(44);
}
4

2 に答える 2

3

やろうとしていることはできません。配列のサイズは、コンパイル時の定数でなければなりません。また、特定のユースケースでコンストラクターに提供される値はコンパイル時の定数である可能性がありますが、C++ はそれを認識できません。

さらに、静的に型付けされた言語として、C++ はコンパイル時にクラスのサイズを計算できる必要があります。sizeof(Foo)正確な単一の値が必要です。そして、あなたはできません。

初期化リストは役に立ちません。実行時サイズの配列が 2 つ必要です。そのstd::vectorためです。コンパイル時のサイズの配列が必要な場合は、テンプレート タイプを使用する必要があります。

template<int count>
class FOO
{
public:
    FOO(initializer_list<Whatever> ilist)
    {
        // interate over x and y to give them their initial and permenent values
    }

private:
    const BAR x[count];
    const TAR y[count * 4];
};

#include "foo.h"
void main(void)
{
    // both need to work as expected
    FOO<30> alpha;
    FOO<44> * bravo = new FOO<44>;
}
于 2012-11-28T02:16:15.840 に答える
0

テンプレート パラメーターを使用してサイズをコンパイル時に構成可能にする Nicol Bolas からの回答に加えて、ヒープにメモリを割り当てることもできます。

class FOO
{
public:
    // this constructor needs to size x = count and y = count * 4
    FOO(int count) : x(new BAR[count]), y(new TAR[count])
    {
        // interate over x and y to give them their initial and permenent values
    }

    // Need a destructor to free the memory we allocated in the constructor
    ~FOO()
    {
        delete [] y;
        delete [] x;
    }
private:
    const BAR* x;
    const TAR* y;
};
于 2012-11-28T07:11:40.817 に答える