Dichiarare una variabile membro che richiede un parametro del costruttore
-
29-10-2019 - |
Domanda
// 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 Dichiarazione a "Member" mi dà un errore di compilazione usando il compilatore G ++: Errore: "A :: Eone" non è un tipo
Come posso superare questo? Devo semplicemente creare un costruttore predefinito che non richiede parametri?
Soluzione
Sembra che tu stia cercando di inizializzare una variabile membro. Potresti fare qualcosa come:
class B
{
public:
B() : memberA(A::eOne) {} // Initializer list in constructor
private:
A memberA;
};
Altri suggerimenti
A
Il costruttore si aspetta a eMyEnum
. Non è chiaro perché vorresti B
costruttore per non accettare un eMyEnum
anche parametro. Comunque, Supponendo a cui il tuo obiettivo è di superare l'argomento a A
costruttore come A::eOne
(al contrario di A::eMyEnum::eOne
), potresti provare il seguente codice, che 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
Tuttavia, nota che memberA
Il costruttore è sempre chiamato con l'argomento come A::eOne
. Non hai mostrato come questo argomento sia usato nel costruttore, ma presumo che nel tuo codice reale iniziasse un membro di A
. Se il membro deve sempre avere lo stesso valore, fallo const
e rimuovere il parametro dal costruttore.
class B
{
public:
B(A::eMyEnum someValue = A::eOne) : memberA(someValue) {};
private:
A memberA;
}
Eone non è il tipo, l'emyenum è il tipo. Quello che stai essenzialmente dicendo è che "devi passare il letterale 2 in questo metodo" - non ha alcun senso. Se non intendi passare un enum in esso, dovrai chiarire cosa stavi cercando.