Déclarant une variable de membre qui prend un paramètre de constructeur
-
29-10-2019 - |
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?
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 B
constructeur de ne pas accepter un eMyEnum
paramètre aussi. De toute façon, en supposant que votre objectif est de passer l'argument à A
Constructeur 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 memberA
Le 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.