1

質問の更新:

C++で次のことをしたい:

struct Param {
public:
    int len;
    int in1;
    float in2;
};

Param params;

class Element {
private:
    int value1;
    float value2;
public:
    Element();
    Element(int n) {value1 = n; value2 = 0;}
    Element(int n1, float n2) {value1 = n1; value2 = n2;}
}

class Parent {
private:
    class Element elem;
    vector<Element> elemVec;
public:
    Parent();
    Parent(int n);
}

Parentコンストラクターを呼び出すときに、クラス要素のデフォルト以外のコンストラクターelemも呼び出されるように、次のコンストラクターを作成したいと思いますelemVec。次のようにコンストラクターをelem呼び出す必要があることがわかりました。

Parent::Parent(int n) : elem(n) {

}

elemVecベクトルの各要素を構築するにはどうすればよいですか。Element(int, float)コンストラクターが各ベクトル要素に対して呼び出されintfloat値が構造体フィールドparams.value1およびから取得されますparams.value2。のサイズはelemVec、構造体フィールドで定義する必要がありますparams.len

コンストラクタ本体にループを記述すると、構築されたオブジェクトの望ましくない動作が発生します。

4

2 に答える 2

5

次の実装が機能するはずです。intただし、からへの暗黙の変換に依存しElement、一般的な解決策ではありません。

Parent::Parent(int n, const vector<int> &numVec)
    : elem(n),
      elemVec(numVec.begin(), numVec.end())
{ }
于 2012-05-17T10:03:48.263 に答える
1

このソリューションは、あなたが望むことを行います:

Parent::Parent(int n, const vector<int>& numVec)
    : elem(n)
{
    elemVec.reserve(numVec.size());
    for (auto num : numVec)
        elemVec.emplace_back(num);
}

空ベクトルのデフォルトの構築は基本的に自由です。

予約は、vector(n) コンストラクターと同様に、必要な完全なメモリ ブロックを割り当てます。

emplace_back は、可能な限り効率的にアイテムを配置します。

于 2012-05-17T10:09:00.753 に答える