Question

 // 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)
 {}

La déclaration à «membre» me donne une erreur de compilation en utilisant le compilateur G ++: Erreur: «A :: eone» n'est pas un type

Comment puis-je surmonter cela? Dois-je simplement créer un constructeur par défaut qui ne prend aucun paramètre?

Était-ce utile?

La solution

Il semble que vous essayiez d'initialiser une variable de membre. Vous pourriez faire quelque chose comme:

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

Autres conseils

A Le constructeur s'attend à un eMyEnum. Il n'est pas clair pourquoi vous voudriez Bconstructeur de ne pas accepter un eMyEnum paramètre aussi. De toute façon, en supposant que votre objectif est de passer l'argument à AConstructeur comme A::eOne (par opposition à A::eMyEnum::eOne), vous pouvez essayer le code suivant, qui utilise 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

Cependant, notez que memberALe constructeur est toujours appelé avec l'argument comme A::eOne. Vous n'avez pas montré comment cet argument est utilisé dans le constructeur, mais je suppose que dans votre code réel, il initialise un membre de A. Si le membre doit toujours avoir la même valeur, faites-le const et supprimez le paramètre du constructeur.

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

    private:   
    A memberA;
}

Eone n'est pas le type, l'emyenunum est le type. Ce que vous dites essentiellement, c'est que "vous devez passer le littéral 2 dans cette méthode" - cela n'a aucun sens. Si vous ne voulez pas y passer une énumération, vous devrez clarifier ce que vous vouliez.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top