1

Fooコンストラクターに必須の引数があるクラスがあるとします。Barさらに、メンバーとして type のオブジェクトを持つ別のクラスを定義したいとしますFoo

class Foo {
private:
   int x;
public:
    Foo(int x) : x(x) {};
};

class Bar {
private:
    Foo f(5);
};

これをコンパイルするとエラーが発生します (この場合、g++ は " error: expected identifier before numeric constant" を返します)。1Foo f(5);つには、コンパイラにとっては関数定義のように見えますが、実際には値 5fで初期化されたインスタンスになりたいと考えてFooいます。ポインタを使用して問題を解決できます。

class Foo {
private:
   int x;
public:
    Foo(int x) : x(x) {};
};

class Bar {
private:
    Foo* f;
public:
    Bar() { f = new Foo(5); }
};

しかし、ポインターを使用する方法はありますか?

4

2 に答える 2

3

ポインターを使用したバージョンは非常に似ています-次のように変更します(以下のコメントを参照):

class Foo {
private:
   int x;
public:
    Foo(int x) : x(x) {};
};

class Bar {
private:
    Foo f;          // Make f a value, not a pointer
public:
    Bar() : f(5) {} // Initialize f in the initializer list
};
于 2013-08-13T20:29:38.000 に答える
1

C++11 をサポートしている場合はf、宣言の時点で初期化できますが、丸括弧では初期化できません():

class Bar {
private:
    Foo f{5}; // note the curly braces
};

Barそれ以外の場合は、のコンストラクター初期化リストを使用する必要があります。

class Bar {
public:
    Bar() : f(5) {}
private:
    Foo f;
};
于 2013-08-13T20:29:28.033 に答える