3
 // In A.h
 class A
 {
  public:
    enum eMyEnum{ eOne, eTwo, eThree };
  public:
    A(eMyEnum e);
 }

 // In B.h
 #include "A.h"
 class B
 {
    B();
    private:
       A memberA;
 }

 // In B.cpp
#include "B.h"
 B::B(void) : memberA(A::eOne)
 {}

'memberA' への宣言により、g++ コンパイラを使用してコンパイル エラーが発生します: エラー: 'A::eOne' は型ではありません

どうすればこれを克服できますか?パラメーターを取らないデフォルトのコンストラクターを作成する必要があるだけですか?

4

4 に答える 4

8

メンバー変数を初期化しようとしているようです。次のようなことができます。

class B
{
public:
    B() : memberA(A::eOne) {}  // Initializer list in constructor
private:
    A memberA;
};
于 2011-09-12T23:28:09.080 に答える
1

AコンストラクターはeMyEnum. BのコンストラクターがeMyEnumパラメーターも受け入れないようにする理由は明らかではありません。とにかく、( ではなく)のコンストラクタに引数を渡すことが目的であると仮定すると、 を使用する次のコードを試すことができます。AA::eOneA::eMyEnum::eOnetypedef

#include <iostream>
using namespace std;

class A {
public:
    typedef enum { eOne, eTwo, eThree } eMyEnum;
public:
    A(eMyEnum e) {
        cout << "A ctor" << endl;
    }
};

class B {
public:
    B() : memberA(A::eOne) {
        cout << "B ctor" << endl;
    }
private:
    A memberA;    

};

int main() {
    B b;
}

// output
A ctor
B ctor

memberAただし、のコンストラクターは常に引数 as で呼び出されることに注意してくださいA::eOne。この引数がコンストラクターでどのように使用されるかを示していませんが、実際のコードでは のメンバーを初期化すると思いますA。メンバーが常に同じ値を持つ必要がある場合は、それを作成constし、コンストラクターからパラメーターを削除します。

于 2011-09-13T09:45:24.487 に答える
1
class B
{
    public:
    B(A::eMyEnum someValue = A::eOne) : memberA(someValue) {};

    private:   
    A memberA;
}
于 2011-09-12T23:47:21.590 に答える
0

eOne は型ではなく、eMyEnum が型です。あなたが本質的に言っているのは、「リテラル 2 をこのメソッドに渡す必要がある」ということです。意味がありません。列挙型を渡すつもりがない場合は、目的を明確にする必要があります。

于 2011-09-12T23:25:47.430 に答える