Programación General > Visual C++

 Visual C++ 7.1 (mvs .net 2003) Y Clases

(1/5) > >>

JoGalGar:
Hola. La situación es la siguiente ...

Estoy realizando un trabajo referente a redes MPLS empleando el programa OMNeT++. Para esto, instalé Microsoft Visual Studio .NET 2003, ya que el empleo del programa OMNeT++ requiere su instalación. La versión anterior (Visual C++ 6.0) causa errores de compilación y recientemente sacaron compatibilidad para el Studio .NET 2005.

OMNeT++ se basa en el uso de clases para el funcionamiento de módulos simples, los cuales son programados en C++. Tengo el archivo Routingtable.h donde declaro los siguiente:

#ifndef _ROUTINGTABLE_H
#define _ROUTINGTABLE_H

#include <omnetpp.h>
#include <string.h>
using std::string;

struct table
{
  string srcip;
  string mask;
  string interin;
  int hop;
  string destip;
  string interout;
  string type;
};

class Routingtable : public cSimpleModule
{
public:
   void addroute(string, string , string , string , int , string);
   void addinterout(string , string , string);
   void findroute(string);
private:
   int structs;
   int flag;
   string interfaceout;
   table rt[10];
};

#endif

y en el archivo Routingtable.cpp delcaro el cuerpo de cada una de las funciones prototipo declaradas en el Routingtable.h. Luego, cree el archivo IP_R.h y el IP_R.cpp. En el archivo IP_R.cpp necesito llamar a la función "void findroute(string)" del Routingtable.h. He intendado muchas formas y no logro encontrar la forma cómo llamar esa función. Puse el #include "Routingtable.h" en el IP_R.cpp para así llamar la función.

Dentro del IP_R.cpp primero puse: findroute("hola"); como prueba para observar si se lograba llamar a la función; sin embargo, esto generó el siguiente error:
IP_R.cpp(29): error C3861: 'findroute': identifier not found, even with argument-dependent lookup
Entonces busqué en internet y encontré que no se pueden llamar funciones de clases y éstas no son estáticas o no se hace referencia a un "objeto". Por lo cual, en el IP_R.h coloqué lo siguiente:
#ifndef IP_R_H
#define IP_R_H

#include <omnetpp.h>
#include <string.h>
using std::string;

#include "IPDatagram_m.h"

class Routingtable; <-------------------

class IP : public cSimpleModule
{
public:
   Routingtable *rta; <-------------------
   void handlemessage(cMessage *msg);
private:
   int pktsin;
   int pktsout;
protected:
   virtual void initialize();
   virtual void finish();
   void display(char *);
};

#endif
Y en el IP_R.cpp, además de poner el #include "Routingtable.h", puse:
rta = new Routingtable();
rta->findroute("hola");
Lo cual me genera el siguiente error:
IP_R.obj : error LNK2019: unresolved external symbol "public: void __thiscall Routingtable::findroute(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char>>)" (?findroute@Routingtable@@QAEXV?$basic_string@DU?$char_traits@D@std@@@@V?$allocator@D@2@@std@@@Z) referenced in function "public: void __thiscall IP::handlemessage(class cMessage *)" (?handlemessage@IP@@QAEXPAVcMessage@@@Z)
IP.exe : fatal error LNK1120: 1 unresolved externals

No soy muy conocedor de clases en C++, de código simple sí. Alguien me podría ayudar porfavor? Muchas gracias.

Eternal Idol:
Esto esta fallando en el enlazado ... ¿Es tuya o de una biblioteca externa? Si es tuya ¿Esa funcion findroute tiene cuerpo? Si es externa faltara algun .lib para poder resolverla.

JoGalGar:
Antes que nada gracias por contestar.

Tanto el IP_R.h y el Routingtable.h, al igual que sus respectivos .cpp son míos. Lo único que incluyo es el #include <omnetpp.h> en cada archivo que realizo. El cuerpo de la función findroute está declarado en el cpp y es el siguiente:

void Routingtable::findroute(string srcip)
{
   for(int i = 0 ; i <= structs ; i++)
      if(rt.srcip == srcip)
         interfaceout = rt.interout;
}

Estuve viendo algunos ejemplos de simulación de omnet y, según yo, estoy haciendo lo mismo que hacen ellos para llamar funciones de calses que son de otros archivos ... pero igual y me hace falta algo que aun no he visto. Acabo de declarar void findroute(string); como virtual void findroute(string); ... Aun así sigue marcando el mismo error.

Eternal Idol:

--- Cita de: "JoGalGar" --- Antes que nada gracias por contestar.
--- Fin de la cita ---
Mmm ¿Podrias reducir el problema a la minima expresion de codigo? De esa manera si lo aislas completamente intentaria compilarlo y enlazarlo ...

JoGalGar:
Otra vez ... gracias por responder.

Adunto los cuarto archivos que estoy utilizando. No están largos ... apenas los estaba haciendo cuando me surgió este problema. Ya lo modifiqué para compilarlos sin problemas en el C++ ... perdón de antemano si se me fue por ahí algun errorcillo. Si me pudieras safar de este problema te lo agradecería. Gracias!!!

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa