Error de C++ en Xcode al inicializar una clase con entradas dentro del encabezado de otra clase.
Me encontré con un error al inicializar una clase que tengo en un archivo de encabezado separado. El problema surgió cuando agregué entradas al constructor de clase que se define en mi encabezado. En un archivo llamado my_header.h
tengo,
class A {
private:
int a;
public:
A (int a_in = 1) : a(a_in) {}
};
Luego quiero usar esta clase en otro archivo, my_class.cpp
. Mi clase también tiene un encabezado, que es donde defino mis variables, así que en my_class.hpp
tengo
#include "my_header.h"
class B {
private:
A a1; // no hay problemas
A a2(2); // errores: "Se esperaba ')'" y "Declarador de parámetro esperado"
int a_in = 3;
A a3(a_in); // error: "Nombre de tipo desconocido 'a_in'"
public:
A return_A ();
};
Idealmente, me gustaría usar a_in
como una variable más adelante para la entrada del usuario, por lo que quiero usarlo para la inicialización.
Me doy cuenta, basándome en el error, de que el compilador no puede captar qué parámetro está ingresando en A::A(int a_in)
. Sé que esto se puede resolver llamando a A::A(int a_in)
en el constructor de B
, gracias a esta publicación.
Sin embargo, ¿hay otra forma de llamar explícitamente a A::A(int a_in)
sin tener que hacerlo en la definición del constructor de B
? Preferiría mantener la definición del constructor de B
en el archivo .cpp
e inicializar las variables, con entradas, en el archivo .hpp
.
Edición: Solución
Usar llaves
int a_in = 3;
A a3 {a_in};
davy.ai
Una forma de resolver este problema sin tener que llamar a
A::A(int a_in)
en el constructor deB
es usar llaves en lugar de paréntesis al inicializar la variablea3
. Se vería así:Esta sintaxis se llama inicialización uniforme y se puede utilizar para inicializar miembros de clase con entradas directamente en el archivo de encabezado. Esto debería solucionar el error de “nombre de tipo desconocido ‘a_in'”.