Dev - C++ - Confusion con llamada a clases y funciones

 
Vista:
sin imagen de perfil

Confusion con llamada a clases y funciones

Publicado por Enrique (5 intervenciones) el 27/02/2015 06:40:04
Hola, pues estoy por hacer un programa que sea un menu de un taller mecanico, pero realmente estoy muy confundido sobre como programar las funciones/metodos de una clase y como llamarlas en el programa principal...

main.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include "Menu.h"
 
using namespace std;
 
int main()
{
    MenuMecanico menuM = MenuMecanico();
    menuM.buscar();
   // lo de los objetos y eso tampoco lo tengo muy claro que digamos :s
 
 
    return 0;
}

Menu.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#ifndef MENU_H
#define MENU_H
#include <iostream>
 
using namespace std;
 
class MenuMecanico
{
    public:
        MenuMecanico();
        void capturar();
        void buscar();
        void mostrar();
    protected:
    private:
};
 
 
#endif // MENU_H


Menu.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "Menu.h"
#include <iostream>
 
void MenuMecanico::buscar()
{
    cout << "Aqui sera el metodo buscar" << endl;
}
 
void MenuMecanico::capturar()
{
    cout << "Aqui sera el metodo capturar del mecanico" << endl;
}
 
void MenuMecanico::mostrar()
{
    cout << "Aqui sera el metodo mostrar" << endl;
}

El compilador me esta marcando estos errores y la verdad es que ando un poco desorientado
|| undefined reference to `MenuMecanico::MenuMecanico()'|
|| undefined reference to `MenuMecanico::buscar()'|
||=== Build failed: 2 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 338
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Confusion con llamada a clases y funciones

Publicado por Martín (158 intervenciones) el 27/02/2015 08:34:37
El error "undefined reference to MenuMecanico::MenuMecanico()" se debe a que falta definir el constructor por defecto de la clase MenuMecanico, que en este caso pude ser:

1
2
3
4
MenuMecanico::MenuMecanico()
{
    std::cout << "constructor de MenuMecanico\n";
}

El otro error, el que se refiere a "MenuMecanico::buscar()", yo creo que no deberías tener problemas ahí; quizá sea un error que se mostraba antes de que agregaras la definición de la función, o este no es exactamente el código que has compilado; no sé, revisa eso.

Por otro lado...

using namespace std;
con esto estas volcando todos los miles de nombres del espacio de nombres std en el espacio de nombres global, y eso no está bien. Puede ser útil para para ejemplos y programas muy sencillos como este, pero en la vida real no es higiénico. Vaya y pase para un .cpp, pero nunca, nunca de los jamases en un .h. ¿Que por qué? Porque puesto en un .h va a abrumar con todos esos nombres a todas las unidades de traducción que incluyan directa o indirectamente ese .h. Si por ahora no te queda claro que quiere decir eso, por lo menos grábate la alerta de que "using namespace std;" es algo muy ordinario que deberías evitar, sobre todo en un .h. En todo caso, busca alternativas más decentes, que las hay.

Otra cosa: si el constructor por defecto no va a inicializar los datos miembros de MenuMecanico de alguna manera particular, lo mejor es no declararlo (y no definirlo, claro está), y dejar que el compilador lo haga.

Martín
Profe de C++
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Confusion con llamada a clases y funciones

Publicado por Enrique (5 intervenciones) el 27/02/2015 15:45:18
Gracias por lo del using namespace std, es un dato que los profesores no nos habian contado,pero bueno, ahora lo que hice fue introducir lo que me dijiste despues del " int main() { " y ahora me marca este error:

||In function 'int main()':|
|8|error: cannot call constructor 'MenuMecanico::MenuMecanico' directly [-fpermissive]|
|8|error: for a function-style cast, remove the redundant '::MenuMecanico' [-fpermissive]|
||=== Build failed: 2 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 338
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Confusion con llamada a clases y funciones

Publicado por Martín (158 intervenciones) el 27/02/2015 17:30:48
¿Has definido al constructor en Menu.cpp?
¿No estarás invocando al constructor de un objeto ya creado?

Al constructor no tienes que invocarlo, se ejecuta solo cuando se crea el objeto, en tu caso, cuando creas menuM en la línea:
1
MenuMecanico menuM = MenuMecanico();
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 338
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Confusion con llamada a clases y funciones

Publicado por Martín (158 intervenciones) el 28/02/2015 00:16:19
1
2
3
4
5
6
7
8
9
10
int main()
{
    MenuMecanico::MenuMecanico();  // --> esto aquí está mal!
    MenuMecanico menuM = MenuMecanico();
 
    menuM.buscar();
 
 
    return 0;
}

Es eso entonces, MenuMecanico::MenuMecanico(); es lo que no debes hacer.
y si comentas
//MenuMecanico::menuMecanico(){
//}
también deberías comentar su declaración en la la definición de la clase.
Puedes leer esto:
http://c.conclase.net/curso/?cap=029
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar