質問

 // 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'はタイプではありません

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

役に立ちましたか?

解決

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

class B
{
public:
    B() : memberA(A::eOne) {}  // Initializer list in constructor
private:
    A memberA;
};

他のヒント

A コンストラクターはaを期待します eMyEnum. 。なぜあなたが望むのかは明らかではありません B受け入れないようにするコンストラクター eMyEnum パラメーターも。ともかく、 仮定します あなたの目的は議論を渡すことです A'のコンストラクターとして A::eOne (とは対照的に A::eMyEnum::eOne)、次のコードを試すことができます。 typedef.

#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のコンストラクターは常に引数と呼ばれます A::eOne. 。あなたはこの引数がコンストラクターでどのように使用されているかを示していませんが、私はあなたの実際のコードでそれがのメンバーを初期化すると思います A. 。メンバーが常に同じ値を持っている必要がある場合は、 const コンストラクターからパラメーターを削除します。

class B
{
    public:
    B(A::eMyEnum someValue = A::eOne) : memberA(someValue) {};

    private:   
    A memberA;
}

eoneはタイプではなく、エミエヌムはタイプです。本質的に言っているのは、「リテラル2をこの方法に渡す必要がある」ということです。意味がありません。列挙を渡すつもりがない場合は、何を目指していたのかを明確にする必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top