Declarar una variable miembro que toma un parámetro de constructor
-
29-10-2019 - |
Pregunta
// 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 declaración a 'miembro' me da un error de compilación usando el compilador G ++: Error: 'a :: eone' no es un tipo
¿Cómo puedo superar esto? ¿Simplemente necesito crear un constructor predeterminado que no tome parámetros?
Solución
Parece que está tratando de inicializar una variable de miembro. Podrías hacer algo como:
class B
{
public:
B() : memberA(A::eOne) {} // Initializer list in constructor
private:
A memberA;
};
Otros consejos
A
El constructor espera un eMyEnum
. No está claro por qué querrías B
El constructor de no aceptar un eMyEnum
parámetro también. De todos modos, asumiendo que tu objetivo es pasar el argumento a A
El constructor como A::eOne
(Opuesto a A::eMyEnum::eOne
), puede probar el siguiente código, que usa 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
Sin embargo, observe que memberA
El constructor siempre se llama con el argumento como A::eOne
. No ha mostrado cómo se usa este argumento en el constructor, pero supongo que en su código real inicializa a un miembro de A
. Si el miembro siempre debe tener el mismo valor, hágalo const
y eliminar el parámetro del constructor.
class B
{
public:
B(A::eMyEnum someValue = A::eOne) : memberA(someValue) {};
private:
A memberA;
}
Eone no es del tipo, Emyenum es el tipo. Lo que es esencialmente diciendo es que "debes pasar el literal 2 a este método", no tiene ningún sentido. Si no quiere pasar un enum en él, tendrá que aclarar lo que estaba buscando.