Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] menu swicth en c++

Estas en el tema de menu swicth en c++ en el foro de C/C++ en Foros del Web. cordial saludo soy algo nuevo con c++ agradezco si alguien me puede ayudar estoy tratando de hacer una aplicación con un menu swicth pero no ...
  #1 (permalink)  
Antiguo 08/03/2015, 19:13
 
Fecha de Ingreso: septiembre-2010
Mensajes: 16
Antigüedad: 13 años, 7 meses
Puntos: 0
menu swicth en c++

cordial saludo soy algo nuevo con c++ agradezco si alguien me puede ayudar

estoy tratando de hacer una aplicación con un menu swicth pero no se que hice mal que no me esta utilizando las funciones que he declarado en el menu.
Código:
#include<iostream>
#include<conio.h>

using namespace std;

#include "listaparcial.h"

int main()
{
 cout<<"\n\t\t***Reserva tu Pasaje OAI***\n\n"<<endl;

    cout<<"Menu Principal:\n\n";
    int m;
    cout<<"1>  Reservar Ticket Vuelo\n\n";
    cout<<"2>  Eliminar Reserva\n\n";
    cout<<"3>  Imprimir Reporte Diario\n\n";
    cout<<"4>  Ingresar Cupos para Vuelos\n\n";
    cout<<"5>  Salir de la Aplicaci\xA2n\n\n";
    cout<<"****Escoja una Opci\xA2n:  ";
    cin>>m;

switch(m)
{
case 1:void Insertar();break;
case 2:void eliminar();break;
case 3:void printreporte();break;
case 4:void cupos();break;
case 5:cout<<"\n\nExit"<<endl;break;
default: cout<<"La Opci\xA2n no esta en el menu"<<endl;
}
    cin.ignore(); return 0;


}
Código:
#ifndef LISTAPARCIAL_H_INCLUDED
#define LISTAPARCIAL_H_INCLUDED

#include <iostream>
using namespace std;

class nodo {
    public:
        nodo(int v,string N,int C, nodo *sig = NULL)
        {
            ciudad = C;
            ID = v;
            nombre = N;
            siguiente = sig;

        }
    private:
        int ID;
        string nombre;
        int ciudad;
        nodo *siguiente;

    friend class lista;
};

typedef nodo *pnodo;


class lista {
   public:
    lista() { primero = actual = NULL; }
    ~lista();

        void Insertar(int v, string N,int C);
        void eliminar();
        bool ListaVacia() { return primero == NULL; }
        void cupos();
        void printreporte();

    private:
        pnodo primero;
        pnodo actual;
};
lista::~lista()
{
   pnodo aux;

   while(primero) {
      aux = primero;
      primero = primero->siguiente;
      delete aux;
   }
   actual = NULL;
}

void lista::Insertar(int v, string N,int C)
{
        cout<<"\n\nDigite ID: ";
        cin>>v;
        cout<<"Ingrese Nombre: ";
        cin>>N;
        cout<<"Ingrese Ciudad Destino(1.Bogota - 2.Cartagena - 3.Miami - 4.Barcelona)";
        cin>>C;
   pnodo anterior;
   if(ListaVacia() || primero->ID > v) {
      primero = new nodo(v,N,C, primero);
   }
   else {
      anterior = primero;
      while(anterior->siguiente && anterior->siguiente->ID <= v)
      anterior = anterior->siguiente;
      anterior->siguiente = new nodo(v,N,C, anterior->siguiente);
   }
}

void lista::eliminar()
{
cout<<"\n\n SALIDA ";
}
void cupos()
{

    cout<<"\n\n SALIDA ";
        int Cbogota=20;
        int Ccartagena=30;
        int Cmiami=10;
        int Cbarcelona=8;
}
void printreporte()
{

}


#endif // LISTAPARCIAL_H_INCLUDED
  #2 (permalink)  
Antiguo 08/03/2015, 20:55
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Respuesta: menu swicth en c++

tienes varios fallos. Lo primero, los void delante de las llamadas quitalos. Ahora bien, eso que quieres usar no son funciones, son metodos de una clase y solo puede usarlo una instancia de esa clase. O sea TLista *lista=new TLista; y luego podras hacer lista->eliminar(); Luego ademas intentas llamar al metod insertar sin parametros y en la declaracion recibe 3 parametros.
  #3 (permalink)  
Antiguo 08/03/2015, 21:23
 
Fecha de Ingreso: septiembre-2010
Mensajes: 16
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: menu swicth en c++

gracias por responder
disculpa mis errores pero estoy tratando de aprender sobre la marcha.
ya borre los void de las llamadas de los métodos en menu
pero me aparece este el error que los métodos no fueron declarados.
TLista *lista=new TLista es para crear una nueva lista pero donde lo declaro

y metod insertar sin parametros y en la declaracion recibe 3 parametros

yo quiero capturar los 3 datos el id el nombre y la ciudad eso lo hago en el punto h
  #4 (permalink)  
Antiguo 09/03/2015, 05:12
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Respuesta: menu swicth en c++

Lo primero, intenta no usar friend, para acceder a miembros privados de otra clase usa metodos como te muestro en el siguiente codigo. No he probado si funciona como tu quieres ya que ni tengo todo el codigo funcional ni se lo que quieres hacer aunque por lo que veo parece un trabajo de listas enlazadas. Ahora compila y ya puedes seguir trabajando sobre esto para ir añadiendo lo que quieras:
En el Main.cpp:
Código PHP:
#include<iostream>
#include<conio.h>
#include "Lista_Parcial.h"

using namespace std;

int main()
{
   
int m;
   
TLista list;
   
cout<<"\n\t\t***Reserva tu Pasaje OAI***\n\n"<<endl;
   
cout<<"Menu Principal:\n\n";
   
cout<<"1>  Reservar Ticket Vuelo\n\n";
   
cout<<"2>  Eliminar Reserva\n\n";
   
cout<<"3>  Imprimir Reporte Diario\n\n";
   
cout<<"4>  Ingresar Cupos para Vuelos\n\n";
   
cout<<"5>  Salir de la Aplicaci\xA2n\n\n";
   
cout<<"****Escoja una Opci\xA2n:  ";
   
cin>>m;

   switch(
m)
   {
      case 
1:
         
//Los valores que meto en Insertar son de prueba
         
list.Insertar(1,"prueba",1);
         break;
      case 
2:
         list.
eliminar();
         break;
      case 
3:
         list.
printreporte();
         break;
      case 
4:
         list.
cupos();
         break;
      case 
5:
         
cout<<"\n\nExit"<<endl;
         break;
      default:
         
cout<<"La Opci\xA2n no esta en el menu"<<endl;
   }
   
cin.ignore();
   return 
0;

En el Lista_Parcial.h:
Código PHP:
//---------------------------------------------------------------------------
#ifndef LISTAPARCIAL_H_INCLUDED
#define LISTAPARCIAL_H_INCLUDED
#include "Nodo.h"
//---------------------------------------------------------------------------

class TLista {
   public:
      
TLista();
      ~
TLista();
      
void Insertar(int vstring N,int C);
      
void eliminar();
      
bool ListaVacia();
      
void cupos();
      
void printreporte();

   private:
      
pnodo primero;
      
pnodo actual;
};

#endif // LISTAPARCIAL_H_INCLUDED 
En Lista_Parcial.cpp:
Código PHP:
#include "Lista_Parcial.h"
//---------------------------------------------------------------------------

TLista::TLista()
{
   
primero actual NULL;
}
//---------------------------------------------------------------------------

TLista::~TLista()
{
   
pnodo aux;

   while(
primero) {
      
aux primero;
      
primero primero->GetSiguiente() ;
      
delete aux;
   }
   
actual NULL;
}
//---------------------------------------------------------------------------

bool TLista::ListaVacia()
{
   return 
primero == NULL;
}
//---------------------------------------------------------------------------

void TLista::Insertar(int vstring N,int C)
{
   
cout<<"\n\nDigite ID: ";
   
cin>>v;
   
cout<<"Ingrese Nombre: ";
   
cin>>N;
   
cout<<"Ingrese Ciudad Destino(1.Bogota - 2.Cartagena - 3.Miami - 4.Barcelona): ";
   
cin>>C;
   
pnodo anterior;

   if(
ListaVacia() || primero->GetID() > v) {
      
primero = new TNodo(v,N,Cprimero);
   }else {
      
anterior primero;
      while(
anterior->GetSiguiente() && anterior->GetSiguiente()->GetID() <= v)
         
anterior anterior->GetSiguiente();
      
anterior->SetSiguiente(v,N,C,anterior->GetSiguiente());
   }
}
//---------------------------------------------------------------------------

void TLista::eliminar()
{
cout<<"\n\n SALIDA ";
}
//---------------------------------------------------------------------------

void TLista::cupos()
{
    
int Cbogota=20;
    
int Ccartagena=30;
    
int Cmiami=10;
    
int Cbarcelona=8;

    
cout<<"\n\n SALIDA ";
}
//---------------------------------------------------------------------------

void TLista::printreporte()
{


En Nodo.h:
Código PHP:
#ifndef NodoH
#define NodoH

#include <iostream>

using namespace std;

class 
TNodo;
typedef TNodo *pnodo;

class 
TNodo {
    public:
        
TNodo(int v,string N,int CTNodo *sig);
        
TNodoGetSiguiente();
        
TNodoTNodo::SetSiguiente(int vstring Nint CTNodonodo);
        
int GetID();
    private:
        
int ID;
        
string nombre;
        
int ciudad;
        
pnodo siguiente;
};
#endif 
En Nodo.cpp:
Código PHP:
#include "Nodo.h"

TNodo::TNodo(int v,string N,int CTNodo *sig)
{
   
sig=NULL;
   
ciudad C;
   
ID v;
   
nombre N;
   
siguiente sig;

}
//---------------------------------------------------------------------------

TNodoTNodo::GetSiguiente()
{
   return 
siguiente;
}

int TNodo::GetID()
{
   return 
ID;
}

TNodoTNodo::SetSiguiente(int vstring Nint CTNodosig)
{
   
TNodoretval;
   
   try
   {
      
retval = new TNodo(v,N,Csig->siguiente);
   }catch(
bad_alloc){
      
retval=NULL;
   }
   return 
retval;

Por facilitar el trabajo, te aconsejo que cada clase la coloques en un archivo independiente para poder luego trabajar mas facilmente con cada una. Espero haber sido de utilidad y perdona por los fallos que pueda tener.
  #5 (permalink)  
Antiguo 09/03/2015, 05:31
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: menu swicth en c++

Cita:
Iniciado por zojurado Ver Mensaje
TLista *lista=new TLista es para crear una nueva lista pero donde lo declaro
TLista no existe en los fuentes que has facilitado. No somos adivinos. Si añades código nuevo y el error te aparece en ese código lo menos que puedes hacer es poner el código para que podamos hacernos una idea de tus problemas.

Así, sin código te digo: "TLista" no existe. Si has creado una clase llamada "TLista" tienes que poner un include al archivo de cabecera de TLista en aquellos archivos donde quieras usar este tipo de objeto. Si lo que sucede es que no has creado una clase llamada "TLista", el problema que tienes es obvio, o usas una clase que exista o creas una clase llamada "TLista".

Cita:
Iniciado por zojurado Ver Mensaje
gracias por responder
disculpa mis errores pero estoy tratando de aprender sobre la marcha.
ya borre los void de las llamadas de los métodos en menu
pero me aparece este el error que los métodos no fueron declarados.
TLista *lista=new TLista es para crear una nueva lista pero donde lo declaro

y metod insertar sin parametros y en la declaracion recibe 3 parametros

yo quiero capturar los 3 datos el id el nombre y la ciudad eso lo hago en el punto h
Te agradecemos también que, aparte de incluir el código fuente, nos mimes un poco más y escribas frases coherentes. Vamos, algo que cualquier hispanohablante pueda entender.

Usar comas y acentos y escribir frases no crípticas no creo que sea un problema si se le pone un poquito de empeño. Ya que escribir en el foro no es como hablar en persona, al menos dedica un minuto a leer lo que has escrito y corrige aquellas faltas que encuentres.

Un saludo.
  #6 (permalink)  
Antiguo 10/03/2015, 16:25
 
Fecha de Ingreso: septiembre-2010
Mensajes: 16
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: menu swicth en c++

gracias por responder nuevamente
adjunto el caso de estudio que me solicita el usuario eferion

Cita:
Caso de estudio
Una empresa de aviación realiza una cantidad variable de reservas (un día antes de cada vuelo), para vuelos a cuatro destinos dentro y fuera del país. En una o varias listas enlazadas se graban los datos correspondientes a las reservas por día. Cada vuelo (cuidad destino) tiene una cantidad de cupos diarios, al iniciar el día antes de empezar a guardar reservas, el programa deberá solicitar el cupo por cada ciudad. Los cupos se asignarán de acuerdo al orden de llegada por cada ciudad, si el cupo se llena, la reserva se reportará en lista de espera, los datos de la reserva son:

Número de identificación.
Nombre del pasajero.
Ciudad de destino (1 Bogotá, 2 Cartagena, 3 Miami, 4 Barcelona).
Elabore un programa en C++ que genere la lista con los datos correspondientes a las reservas de los vuelos y al final del día pueda proveer la siguiente información:

Número total de reservas realizadas.
Número de reservas por ciudad.
Imprima las Listas de los pasajeros reservados con cupo por ciudad destino y en orden de llegada.
Imprima las listas de espera en orden de llegada por cada vuelo o ciudad destino.
Número de personas que solicitaron reserva al extranjero y número de personas que solicitaron reserva dentro del país.

Si al pasajero se le puede hacer la reserva, imprima toda su información y el mensaje: “Cupo reservado”.

Si al pasajero No se le puede hacer la reserva, imprima toda su información y el mensaje: “En lista de espera”.

DISEÑE UN MENÚ PARA EL USUARIO, A SU GUSTO, EN LO POSIBLE QUE SEA LO MÁS PRÁCTICO Y NECESARIO. (En cualquier momento se pueden cambiar los cupos de los vuelos y las estadísticas pueden ser revisadas)

hola aguml gracias por tomarte el tiempo de responder como ves tengo poco conocimiento de c++
al compilar el codigo que me enviaste salio el error error: extra qualification

por esta sentencia TNodo* TNodo::SetSiguiente(int v, string N, int C, TNodo* nodo);
al buscar el error encontré que era que el compilador no acepta ese tipo de definicion.

al cambiarlo a esta forma
TNodo* SetSiguiente(int v, string N, int C, TNodo* nodo);

se quita el erro pero aparecen estos:

undefined reference to `TLista::TLista()'|
undefined reference to `TLista::Insertar(int, std::string, int)'|
undefined reference to `TLista::eliminar()'|
undefined reference to `TLista::printreporte()'|
undefined reference to `TLista::cupos()'|
undefined reference to `TLista::~TLista()'|
undefined reference to `TLista::~TLista()'|
||=== Build failed: 7 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|


nuevamente gracias por su tiempo y apoyo
  #7 (permalink)  
Antiguo 11/03/2015, 00:20
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Respuesta: menu swicth en c++

lo de TNodo* TNodo::SetSiguiente(int v, string N, int C, TNodo* nodo); 
 Tienes razon, es lo que tiene copiar y pegar, que algunas veces se nos escapan cosas asi. Con respecto a los erroresadeltlista, go estas haciendo mal ya que el codigo que te puse está probado y funciona. Casi seguro que algo has cambiado. ¿Existen Lista_Parcial.h y Lista_Parcial.cpp? Los errores que te esta dando es porque incluyes el .h y no se encuentran las funciones que se declaran en el. Casi seguro cambiaste los nombres. El .h y el .cpp tienen que tener el mismo nombre.
  #8 (permalink)  
Antiguo 11/03/2015, 01:07
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: menu swicth en c++

Cita:
Iniciado por zojurado Ver Mensaje
undefined reference to `TLista::TLista()'|
undefined reference to `TLista::Insertar(int, std::string, int)'|
undefined reference to `TLista::eliminar()'|
undefined reference to `TLista::printreporte()'|
undefined reference to `TLista::cupos()'|
undefined reference to `TLista::~TLista()'|
undefined reference to `TLista::~TLista()'|
||=== Build failed: 7 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
¿Por qué no nos facilitas el código fuente para ver qué estás haciendo mal?
  #9 (permalink)  
Antiguo 11/03/2015, 04:39
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Respuesta: menu swicth en c++

ya digo yo que el fallo es por los nombres del .h y .cpp. Yo hago en el main.cpp:
#include "Lista_Parcial.h"

Si él el .h lo llama por ejemplo Lista_Parcial.h y el .cpp lo llama Manolito.cpp (por poner un ejemplo) y luego añades el .h a tu proyecto, el compilador no encontrará las declaraciones de las funciones miembros y por tanto te tirará ese error. A mi me ha pasado muchas veces cuando en el prototipo pongo un nombre diferente que en la declaracion por despiste.
Si no ha cambiado nada del codigo que le puse es eso seguro.
  #10 (permalink)  
Antiguo 11/03/2015, 06:05
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: menu swicth en c++

Cita:
Iniciado por aguml Ver Mensaje
Si él el .h lo llama por ejemplo Lista_Parcial.h y el .cpp lo llama Manolito.cpp (por poner un ejemplo) y luego añades el .h a tu proyecto, el compilador no encontrará las declaraciones de las funciones miembros y por tanto te tirará ese error.
El cpp se puede llamar como te de la gana. Lo único importante es que los includes a los .h sean correctos. Es más, no hay nada que te impida tener la implementación de una clase repartida por cientos de cpp
  #11 (permalink)  
Antiguo 11/03/2015, 06:19
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 7 meses
Puntos: 10
Respuesta: menu swicth en c++

Cita:
Iniciado por eferion Ver Mensaje
El cpp se puede llamar como te de la gana. Lo único importante es que los includes a los .h sean correctos. Es más, no hay nada que te impida tener la implementación de una clase repartida por cientos de cpp
Cuantas cosas me quedan por saber (o no sé correctamente)
__________________
Mi calculadora en Qt
  #12 (permalink)  
Antiguo 11/03/2015, 06:28
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: menu swicth en c++

Cita:
Iniciado por dehm Ver Mensaje
Cuantas cosas me quedan por saber (o no sé correctamente)
yo aprendo algo nuevo casi todas las semanas ;)
  #13 (permalink)  
Antiguo 11/03/2015, 09:26
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 7 meses
Puntos: 38
Respuesta: menu swicth en c++

Cita:
Iniciado por eferion Ver Mensaje
yo aprendo algo nuevo casi todas las semanas ;)
¿¿¿Aún te queda algo por aprender??? XDD
  #14 (permalink)  
Antiguo 11/03/2015, 10:00
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: menu swicth en c++

Cita:
Iniciado por vangodp Ver Mensaje
¿¿¿Aún te queda algo por aprender??? XDD
Muchas cosas, jejeje... ahora estoy cacharreando con la parte fea de los templates, a ver si me entra de una vez jejejeje
  #15 (permalink)  
Antiguo 11/03/2015, 12:14
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Respuesta: menu swicth en c++

Pues la verdad es que yo tenia entendido que ambos se tenian que llamar igual. ¿como seria para que sean nombres diferentes y lo lea? Yo lo intento y me sale el mismo error que al compañero ya que no encuentra las definiciones de las funciones.
  #16 (permalink)  
Antiguo 12/03/2015, 01:02
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: menu swicth en c++

Cita:
Iniciado por aguml Ver Mensaje
Pues la verdad es que yo tenia entendido que ambos se tenian que llamar igual. ¿como seria para que sean nombres diferentes y lo lea? Yo lo intento y me sale el mismo error que al compañero ya que no encuentra las definiciones de las funciones.
"las definiciones" se encuentran en los archivos de cabecera, mientras que "las implementaciones" suelen estar en los cpp.

El compilador necesita los archivos de cabecera para elaborar un listado de las funciones y métodos del programa... con eso elabora un índice que permite enlazar las diferentes llamadas a funciones y métodos.

A la hora de linkar, el compilador sustituye esas entradas del índice por la dirección real en la que empieza el código de la función. Si resulta que no encuentra la implementación de una función, entonces se produce un error en tiempo de linkado. Al compilador realmente le da igual dónde y cómo esté estructurado el código... el tiene una lista de archivos a compilar y a partir de ellos el intenta crear el programa... si se encuentra con algún problema te lo comunica y listo, no se complica la vida.

Si no se encuentra la firma de una función (es decir, su declaración) el mensaje de error suele ser del tipo 'XXX was not declared in this scope', mientras que los errores por no encontrar la implementación de la función son del tipo 'undefined reference to XXX'.

Si nos encontramos con el error de que no encuentra el archivo de cabecera, debemos comprobar los includes para asegurarnos de que el compilador dispone de todas las firmas necesarias.

En el caso de que el error sea que no se encuentra la implementación de la función, lo que tenemos que hacer es comprobar que el archivo de código (el cpp) está incluído en el proyecto. También tenemos que prestar atención a las dependencias entre archivos. Si todo lo anterior está bien, no está de más asegurarnos que hemos escrito bien los nombres de las clases y métodos (en la llamada, en la firma y en la implementación).

PD.: una forma de comprobar que no es necesario que una clase tenga que estar en un archivo de cabecera con el mismo nombre es que podemos declarar varias clases en un mismo archivo de cabecera (resulta obvio que cada clase tiene que tener un nombre único). Así mismo, también podemos crear todo nuestro programa en un único archivo... y seguirá funcionando. Los nombres de los archivso es una utilidad para el programador, ya que así puede estructurar el código para que le resulte sencillo localizar el fragmento de código que está buscando.
  #17 (permalink)  
Antiguo 12/03/2015, 03:04
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Respuesta: menu swicth en c++

Cita:
Iniciado por eferion Ver Mensaje
"las definiciones" se encuentran en los archivos de cabecera, mientras que "las implementaciones" suelen estar en los cpp.
Tienes razón, me lié con prototipos, definiciones y implementaciones jejeje.

Cita:
Iniciado por eferion Ver Mensaje
El compilador necesita los archivos de cabecera para elaborar un listado de las funciones y métodos del programa... con eso elabora un índice que permite enlazar las diferentes llamadas a funciones y métodos.

A la hora de linkar, el compilador sustituye esas entradas del índice por la dirección real en la que empieza el código de la función. Si resulta que no encuentra la implementación de una función, entonces se produce un error en tiempo de linkado. Al compilador realmente le da igual dónde y cómo esté estructurado el código... el tiene una lista de archivos a compilar y a partir de ellos el intenta crear el programa... si se encuentra con algún problema te lo comunica y listo, no se complica la vida.

Si no se encuentra la firma de una función (es decir, su declaración) el mensaje de error suele ser del tipo 'XXX was not declared in this scope', mientras que los errores por no encontrar la implementación de la función son del tipo 'undefined reference to XXX'.

Si nos encontramos con el error de que no encuentra el archivo de cabecera, debemos comprobar los includes para asegurarnos de que el compilador dispone de todas las firmas necesarias.

En el caso de que el error sea que no se encuentra la implementación de la función, lo que tenemos que hacer es comprobar que el archivo de código (el cpp) está incluído en el proyecto. También tenemos que prestar atención a las dependencias entre archivos. Si todo lo anterior está bien, no está de más asegurarnos que hemos escrito bien los nombres de las clases y métodos (en la llamada, en la firma y en la implementación).

PD.: una forma de comprobar que no es necesario que una clase tenga que estar en un archivo de cabecera con el mismo nombre es que podemos declarar varias clases en un mismo archivo de cabecera (resulta obvio que cada clase tiene que tener un nombre único). Así mismo, también podemos crear todo nuestro programa en un único archivo... y seguirá funcionando. Los nombres de los archivso es una utilidad para el programador, ya que así puede estructurar el código para que le resulte sencillo localizar el fragmento de código que está buscando.
Correcto pero si nombro al cpp igual que al .h el programa encontrará las implementaciones incluso aunque no añada el cpp al proyecto ¿no?
  #18 (permalink)  
Antiguo 12/03/2015, 03:11
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: menu swicth en c++

Cita:
Iniciado por aguml Ver Mensaje
Correcto pero si nombro al cpp igual que al .h el programa encontrará las implementaciones incluso aunque no añada el cpp al proyecto ¿no?
No. si no añades el cpp al proyecto el compilador no podrá compilar porque no sabrá donde encontrar los fuentes que le faltan.

Matizo: Normalmente se programa usando un IDE. El IDE va a generar por nosotros unos ficheros makefile que serán los que se usarán par compilar nuestro proyecto. Dependiendo del IDE, puede que sea necesario forzar la regeneración de estos archivos para que el proyecto se compile correctamente.

Si, por contra, estamos generando nosotros la compilación a de forma manual o creando nuestros propios makefile, es nuestra responsabilidad añadir los archivos necesarios para que el programa se compile correctamente.
  #19 (permalink)  
Antiguo 12/03/2015, 03:18
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Respuesta: menu swicth en c++

Cita:
Iniciado por eferion Ver Mensaje
No. si no añades el cpp al proyecto el compilador no podrá compilar porque no sabrá donde encontrar los fuentes que le faltan.

Matizo: Normalmente se programa usando un IDE. El IDE va a generar por nosotros unos ficheros makefile que serán los que se usarán par compilar nuestro proyecto. Dependiendo del IDE, puede que sea necesario forzar la regeneración de estos archivos para que el proyecto se compile correctamente.

Si, por contra, estamos generando nosotros la compilación a de forma manual o creando nuestros propios makefile, es nuestra responsabilidad añadir los archivos necesarios para que el programa se compile correctamente.
Tienes razon, lo he probado y si no añado el cpp al proyecto no compila. Mira que he hecho eso miles de veces pero no se por que tenia en la cabeza que si se llamaban iguales no hacia falta aunque me habrá pasado muchas veces y todas las he tenido que añadir al proyecto. Seguramente es lo que le falta al compi, añadir el cpp al proyecto
  #20 (permalink)  
Antiguo 12/03/2015, 21:35
 
Fecha de Ingreso: septiembre-2010
Mensajes: 16
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: menu swicth en c++

vaya que bueno que mi post esta ayudando a generar conocimiento, ese mi granito de arena para la comunidad.

amigos gracias sus concejos ya compila el proyecto es verdad como ustedes indican tiene que reconocerlo el codeblock y dev igual como archivo ligados a un proyecto sino los compila independiente y genera ese error.
  #21 (permalink)  
Antiguo 14/03/2015, 15:05
 
Fecha de Ingreso: septiembre-2010
Mensajes: 16
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: menu swicth en c++

cordial saludo sigo con mi programa y espero me puedan ayudar con las siguientes dudas:
adjunto el codigo que llevo hasta ahora
main.ccp
Código:
#include <iostream>
#include<conio.h>
#include"ListaParcial.h"
#include"concolor.h"
using namespace std;

int main()
{
   char op='0';
   int m;
   TLista list;

   while(op < '5')
   {
   cout<<red<<"\n*************************************************"<<endl;
   cout<<blue<<"\t*****Reserva tu Tiquete OAI*****\n"<<endl;
   cout<<greenb<<"\t\t**Menu Principal**\n\n";
   cout<<blue<<"\n1>  Reservar Ticket Vuelo\n\n";
   cout<<blue<<"2>  Eliminar Reserva\n\n";
   cout<<blue<<"3>  Imprimir Reporte Diario\n\n";
   cout<<blue<<"4>  Ingresar Cupos para Vuelos\n\n";
   cout<<blue<<"5>  Salir de la Aplicaci\xA2n\n\n";
   cout<<red<<"*************************************************"<<endl;
   cout<<yellow<<"\nEscoja una Opci\xA2n=>  ";
   cin>>m;

   switch(m)
    {
      case 1:list.Insertar();break;
      case 2:list.eliminar();break;
      case 3:list.printreporte();break;
      case 4:list.cupos();break;
      case 5:cout<<"\n\nExit"<<endl;break;
      default:cout<<"La Opci\xA2n no esta en el menu"<<endl;
            op='0';
            getch();
    }
   }
   cin.ignore();
   return 0;
}
ListaParcial.h
Código:
#ifndef LISTAPARCIAL_H_INCLUDED
#define LISTAPARCIAL_H_INCLUDED
#include "Nodo.h"

//---------------------------------------------------------------------------

class TLista {
   public:
      TLista();
      ~TLista();
      void Insertar();
      void eliminar();
      bool ListaVacia();
      void cupos();
      void printreporte();
      //void storeinfo();


   private:
      pnodo primero;
      pnodo actual;
};
ListaParcial.cpp
Código:
#include "ListaParcial.h"

//---------------------------------------------------------------------------

TLista::TLista()
{
   primero = actual = NULL;
}
//---------------------------------------------------------------------------

TLista::~TLista()
{
   pnodo aux;

   while(primero) {
      aux = primero;
      primero = primero->GetSiguiente() ;
      delete aux;
   }
   actual = NULL;
}

void TLista::Insertar()
{
   int v,C;
   string N;
   char res='s';
   while (res == 's' || res=='S')
   {
        cout<<"\n**Datos del Pasajero**"<<endl;
        cout<<"\nDigite ID: ";
        cin>>v;
        cout<<"Ingrese Nombre: ";
        cin>>N;
        cout<<"Ingrese Ciudad Destino(1.Bogota - 2.Cartagena - 3.Miami - 4.Barcelona): ";
        cin>>C;
        cout<<"\n\n\tDesea hacer otra reserva? (s/n) :\n";
        cin>>res;
   }

   pnodo anterior;

   if(ListaVacia() || primero->GetID() > v) {
      primero = new TNodo(v,N,C, primero);
   }else {
      anterior = primero;
      while(anterior->GetSiguiente() && anterior->GetSiguiente()->GetID() <= v)
         anterior = anterior->GetSiguiente();
      anterior->SetSiguiente(v,N,C,anterior->GetSiguiente());
   }
}
//---------------------------------------------------------------------------

void TLista::eliminar()
{
cout<<"\n\n SALIDA ";
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------

bool TLista::ListaVacia()
{
   return primero == NULL;
}
//---------------------------------------------------------------------------

void TLista::cupos()
{
        int l,k,j,h;

        cout<<"\n**CUPOS DISPONIBLES A CIUDADES**"<<endl;
        cout<<"\nCUPOS DISPONIBLES A BOGOTA=>";
        cin>>l;
        cout<<"\nCUPOS DISPONIBLES A CARTAGENA=>";
        cin>>k;
        cout<<"\nCUPOS DISPONIBLES A MIAMI=>";
        cin>>j;
        cout<<"\nCUPOS DISPONIBLES A BARCELONA=>";
        cin>>h;
}

//---------------------------------------------------------------------------

void TLista::printreporte()
{
TNodo *aux;

   aux = primero;

    cout<<"Identificacion: "<<aux->GetID()<<"  Nombre: "<<aux->Getnombre()<<"  Destino: "<<aux->Getciudad();
}
Nodo.h
Código:
#ifndef NodoH
#define NodoH
#include <conio.h>
#include <iostream>

using namespace std;

class TNodo;
typedef TNodo *pnodo;

class TNodo {
    public:
        TNodo(int v,string N,int C, TNodo *sig);
        TNodo* GetSiguiente();
        TNodo* SetSiguiente(int v, string N, int C, TNodo* nodo);
        int GetID();
        int Getciudad();
        string Getnombre();
    private:
        int ID;
        string nombre;
        int ciudad;
        pnodo siguiente;
};
#endif
Nodo.cpp
Código:
#include"Nodo.h"

TNodo::TNodo(int v,string N,int C, TNodo *sig)
{
   sig=NULL;
   ciudad = C;
   ID = v;
   nombre = N;
   siguiente = sig;
}
//---------------------------------------------------------------------------
TNodo* TNodo::GetSiguiente()
{
   return siguiente;
}
int TNodo::GetID()
{
   return ID;
}
int TNodo::Getciudad()
{
   return ciudad;
}
string TNodo::Getnombre()
{
    return nombre;
}
TNodo* TNodo::SetSiguiente(int v, string N, int C, TNodo* sig)
{
   TNodo* retval;
   try
   {
      retval = new TNodo(v,N,C, sig->siguiente);
   }catch(bad_alloc){
      retval=NULL;
   }
   return retval;
}
concolor.h
Código:
//concolor.h
//v0.2
//Pequeña "librería" para mostrar mensajes con color en la consola.
//Funciona en Windows y Linux.

//Uso: cout<<color<<"mensaje";
//Para compilar en Windows, usar -DWIN
//Para compilar en Linux, usar -DLINUX

/*
Copying and distribution of this file, with or without modification,
are permitted in any medium without royalty provided the copyright
notice and this notice are preserved. This file is offered as-is,
without any warranty.
*/

//Creado por Johny
//http://www.johny65corp.com.ar

#ifndef _CONCOLOR_
#define _CONCOLOR_

#include <iostream>

#define WIN

#ifdef WIN

#include <windows.h>

static bool normalizado = false;
static HANDLE hStdout;
static WORD normalc;

void normalizar()
{
	if (!normalizado){
		hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
		CONSOLE_SCREEN_BUFFER_INFO prop;
		GetConsoleScreenBufferInfo(hStdout, &prop);
		normalc = prop.wAttributes;
		normalizado = true;
	}
}

inline std::ostream& normal(std::ostream &s)
{
	normalizar();
	SetConsoleTextAttribute(hStdout, normalc);
	return s;
}

inline std::ostream& normalb(std::ostream &s)
{
	normalizar();
	SetConsoleTextAttribute(hStdout, normalc);
	return s;
}

inline std::ostream& black(std::ostream &s)
{
	normalizar();
	SetConsoleTextAttribute(hStdout, FOREGROUND_INTENSITY);
	return s;
}

inline std::ostream& blackb(std::ostream &s)
{
	normalizar();
	SetConsoleTextAttribute(hStdout, 0);
	return s;
}

inline std::ostream& blueb(std::ostream &s)
{
	normalizar();
	SetConsoleTextAttribute(hStdout, FOREGROUND_BLUE);
	return s;
}

inline std::ostream& blue(std::ostream &s)
{
	normalizar();
	SetConsoleTextAttribute(hStdout, FOREGROUND_BLUE | FOREGROUND_INTENSITY);
	return s;
}

inline std::ostream& greenb(std::ostream &s)
{
	normalizar();
	SetConsoleTextAttribute(hStdout, FOREGROUND_GREEN);
	return s;
}

inline std::ostream& green(std::ostream &s)
{
	normalizar();
	SetConsoleTextAttribute(hStdout, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
	return s;
}

inline std::ostream& cyanb(std::ostream &s)
{
	normalizar();
	SetConsoleTextAttribute(hStdout, FOREGROUND_GREEN | FOREGROUND_BLUE);
	return s;
}

inline std::ostream& cyan(std::ostream &s)
{
	normalizar();
	SetConsoleTextAttribute(hStdout, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
	return s;
}

inline std::ostream& redb(std::ostream &s)
{
	normalizar();
	SetConsoleTextAttribute(hStdout, FOREGROUND_RED);
	return s;
}

inline std::ostream& red(std::ostream &s)
{
	normalizar();
	SetConsoleTextAttribute(hStdout, FOREGROUND_RED | FOREGROUND_INTENSITY);
	return s;
}

inline std::ostream& magentab(std::ostream &s)
{
	normalizar();
	SetConsoleTextAttribute(hStdout, FOREGROUND_RED | FOREGROUND_BLUE);
	return s;
}

inline std::ostream& magenta(std::ostream &s)
{
	normalizar();
	SetConsoleTextAttribute(hStdout, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
	return s;
}

inline std::ostream& yellowb(std::ostream &s)
{
	normalizar();
	SetConsoleTextAttribute(hStdout, FOREGROUND_RED | FOREGROUND_GREEN);
	return s;
}

inline std::ostream& yellow(std::ostream &s)
{
	normalizar();
	SetConsoleTextAttribute(hStdout, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
	return s;
}

inline std::ostream& whiteb(std::ostream &s)
{
	normalizar();
	SetConsoleTextAttribute(hStdout, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
	return s;
}

inline std::ostream& white(std::ostream &s)
{
	normalizar();
	SetConsoleTextAttribute(hStdout, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
	return s;
}

struct color {
	color(WORD attribute):m_color(attribute){};
	WORD m_color;
};

template <class _Elem, class _Traits> std::basic_ostream<_Elem,_Traits>& operator<<(std::basic_ostream<_Elem,_Traits>& i, color& c)
{
	SetConsoleTextAttribute(hStdout, c.m_color);
	return i;
}



#else
#error Falta definir sistema operativo! Definir WIN o LINUX
#endif
#endif
ahora tengo que usar listas enlazadas para este programa, tengo estas dudas
1 porque cuando imprimo el reporte solo me muestra el ultimo dato guardado y no los datos que se deberían almacenar en la lista (ID, nombre , ciudad destino)

2 como puedo indicarle al programa que el tamaño de los cupo de vuelo a las ciudades sea el valor de tamaño de la lista para poder dar el mensaje de cupos lleno

3como puedo mejorar la impresion para que salga estilo ejemplo

identificacion nombre destino
333333 pepe 1
333333 juan 2

gracias por su valioso tiempo y espero que me puedan guiar que ya me toca entregarlo la semana próxima y es el examen.

Última edición por zojurado; 14/03/2015 a las 15:08 Razón: olvide un archivo
  #22 (permalink)  
Antiguo 15/03/2015, 03:02
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Respuesta: menu swicth en c++

En el metodo Insertar tienes un bucle que practicamente no sirve de nada ya que solo se creará un nodo y solo uno al salir de el y quizas por eso sea que solo guardas el ultimo que ingreses. Arreglalo y nos dices.
Con lo de saber el numero pues es tan facil como crear una variable privada en la clase TLista que sirva de contador de nodos y cada vez que ingreses uno se incremente y cada vez que elimines uno se decremente. Luego te creas un metodo al estilo GetNumNodos() el cual te devuelva cuantos hay en la lista.
Con respecto a lo de posicionar mejor los campos, veo que estas usando conio.h de borland. No es de mi agrado pero bueno, para este caso te puede venir muy bien porque trae una funcion llamada gotoxy que es para posicionar la cadena en unas coordenadas concretas.

Etiquetas: funcion, int
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:09.