es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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};
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una forma de resolver este problema sin tener que llamar a A::A(int a_in) en el constructor de B es usar llaves en lugar de paréntesis al inicializar la variable a3. Se vería así:

    int a_in = 3;
    A a3{a_in};
    

    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'”.

Comments are closed.