Ich habe alle Klassendefinitionen in einer Header-Datei: ModelModule.h. Ich habe für diese Datei des Beispielcode zur Verfügung gestellt unten, wo ich die Erklärung von 2 Klassen gegeben habe und ihre Mitgliedsfunktionen:Eclipse C++ - Projekt erstellt nicht: Konstruktor Destruktor Problem
#pragma once
#if !defined(MODELMODULE_H)
#define MODELMODULE_H
//Required header files
class CModelModule;
class COrdProbitMM;
class CModelModule
// virtual base class for all types of modeling modules
{
friend class CSimCoordinator;
friend class CHouseholdCoordinator;
friend class CGenericHousehold;
public:
CModelModule(void);
~CModelModule(void);
protected:
std::string m_Label;
std::vector<int> m_AvailEndAttr;
void GetVarValues(std::vector<int>&, std::vector<double> &);
public:
virtual void Configure(void){};
virtual void loadXmlString(xmlNodePtr pXmlNode, xmlDocPtr pXmlDoc, xmlChar * con);
virtual void SaveXml(std::ofstream& fout){};
double mrand(void);
double UniformRand(); // returns a U[0,1] random number
double StdNormalRand(); // returns a N(0,1) random number
};
class COrdProbitMM : public CModelModule
// Class represent the ordered-probit models
{
friend class CSimCoordinator;
friend class CHouseholdCoordinator;
friend class CMMRunner;
public:
COrdProbitMM(CSimCoordinator& simcord, std::string& sLabel);
COrdProbitMM(CSimCoordinator& simcord, std::string& sLabel, int nAlts);
~COrdProbitMM(void);
private:
int m_Max_nAlts;
std::vector<double> m_Thresholds;
public:
void Configure(void);
void copyConfigure(COrdProbitMM* that);
int Run(CHouseholdObject*);
int Run(CPersonObject*);
void loadXmlString(xmlNodePtr pConfNode, xmlDocPtr pXmlDoc, xmlChar* con);
private:
int Run(void);
};
Nun wird die Funktionsdefinitionen haben in einer CPP-Datei gegeben worden: ModelModule.cpp. Hinweis: Die Header-Datei wurde eingefügt.
#include "ModelModule.h"
//Other header files
//Code for all the other functions defined here
//Given below are the code for how the constructors and destructors are defined
COrdProbitMM::~COrdProbitMM(void)
{
}
CModelModule::CModelModule(void)
{
}
CModelModule::~CModelModule(void)
{
}
Ich habe den Code von jedem syntaktischen Fehler befreit. Wenn ich jedoch den Code erstelle, bekomme ich den Fehler make: * [ProjectName] Error1. Auf Inspektion der Konsole finde ich die folgenden Wesen angezeigt:
Building target: Project Name
Invoking: GCC C++ Linker
g++ -o "XYZ" ./src/XYZ.o ./src/DataCache\ -\ Copy.o ./src/DataCache.o ./src/DataCoordinator.o ./src/DataObject.o ./src/HouseholdCoordinator.o ./src/
LinearEquation.o ./src/MMRunner.o ./src/MainFrm.o ./src/ModelModule.o ./src/SimCoordinator.o ./src/main.o -lxml2 -lsqlite3
./src/ModelModule.o: In function `CModelModule::CModelModule()':
ModelModule.cpp:(.text._ZN12CModelModuleC2Ev[CModelModule::CModelModule()]+0xd): undefined reference to `vtable for CModelModule'
./src/ModelModule.o: In function `CModelModule::~CModelModule()':
ModelModule.cpp:(.text._ZN12CModelModuleD2Ev[CModelModule::~CModelModule()]+0xd): undefined reference to `vtable for CModelModule'
./src/ModelModule.o:(.rodata._ZTI12COrdProbitMM[typeinfo for COrdProbitMM]+0x8): undefined reference to `typeinfo for CModelModule'
collect2: ld returned 1 exit status
make: *** [Project Name] Error 1
**** Build Finished ****
ich dieses Forum für die VTable Fehler überprüft und es wurde erwähnt, dass das Problem ist, wenn wir einen Konstruktor/Destruktor deklarieren, aber es nie definieren. Aber das scheint in diesem Fall kein Problem zu sein, wie es in ModelModule.cpp explizit gemacht wurde. Es scheint etwas sehr Grundlegendes hier zu sein, das meine Aufmerksamkeit auf sich zieht.
- Was fehlt mir?
- Können Sie mir sagen, was mit der virtuellen Funktion ist und wie es den Fehler verursacht hat?
- Ist es irgendwie mit dem Konstruktor und Destruktor verbunden?
Haben Sie Definitionen für ** Alle ** angegeben, die Sie als 'virtuell' deklariert haben? Der Fehler ist typisch, wo Sie die Definition für eine 'virtuelle' Methode vermissen.Standard schreibt vor, dass alle Methoden außer rein' virtuell' eine Definition haben sollen. –
virtuelles void Konfigurieren (void) {}; virtueller void loadXmlString (xmlNodePtr pXmlNode, xmlDocPtr pXmlDoc, xmlChar * con); virtuelles void SaveXml (std :: ofstream & fout) {}; - Ich habe diese drei definiert .... – sriramn
Wie wäre es mit 'CModelModule :: loadXmlString'? –