すべてのクラス定義は、ヘッダーファイルModelModule.hにあります。Eclipse C++プロジェクトがビルドされていません:コンストラクタデストラクタ問題
#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);
};
次に関数定義は、.cppファイルに付与されている:ModelModule.cpp私は2つのクラスとそのメンバ関数の宣言を与えている場合、以下に、そのファイルのためのサンプルコードを提供しています。注:ヘッダーファイルが含まれています
#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)
{
}
構文エラーのコードを削除しました。しかし、コードをビルドするときにエラーが発生します。* [ProjectName] Error1。私は、次が表示されて見つけるコンソール検査で:
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 ****
を私はvtableのエラーのためにこのフォーラムをチェックアウトし、それは私たちがコンストラクタ/デストラクタを宣言し、それを定義することはありませんときに問題があることを述べました。しかし、ModelModule.cppで明示的に行われているので、このケースでは問題はないようです。私の注意を奪っている、ここで起こっている非常に基本的なことがあるようです。
- 私が紛失していることは何ですか?
- バーチャルファンクションの機能とそのエラーの原因を教えてください。
- 何とかコンストラクタとデストラクタにリンクしていますか?
「すべて」の定義を提供しましたか?「仮想」と宣言したメソッドはありますか?このエラーは典型的なもので、 'virtual'メソッドの定義を見逃してしまいます。標準的な' virtual'以外のメソッドは全て定義されていなければなりません。 –
virtual void Configure(void){}; 仮想void loadXmlString(xmlNodePtr pXmlNode、xmlDocPtr pXmlDoc、xmlChar * con); virtual void SaveXml(std :: ofstream&fout){}; - 私はこれら3つを定義しました.... – sriramn
'CModelModule :: loadXmlString'はどうですか? –