未定义对 vtable 错误的引用
Undefined reference to vtable error
我已经尝试解决此错误 3 个小时了,但我仍然没有发现我的代码有任何问题。我有一个类 GrainLJ,它继承自一个抽象类 Grain。GrainLJ类也有2个子类GrainLJT1和GrainLJT2。
整个错误:
g++ -std=c++11 -pedantic -Wall -g -c -o GrainLJTUn.o GrainLJTUn.cc
g++ testGrain.o Vecteur3D.o GrainLJTUn.o -o testGrain
testGrain.o: In function `GrainLJ::~GrainLJ()':
/home/INTRANET/mushkaev/myfiles/cpp/projet/marche/marche/GrainLJ.h:18: undefined reference to `vtable for GrainLJ'
testGrain.o: In function `TextSupport::dessine(GrainLJ const&)':
/home/INTRANET/mushkaev/myfiles/cpp/projet/marche/marche/TextSupport.h:15: undefined reference to `operator<<(std::ostream&, GrainLJ const&)'
testGrain.o: In function `TextSupport::dessine(Plan const&)':
/home/INTRANET/mushkaev/myfiles/cpp/projet/marche/marche/TextSupport.h:17: undefined reference to `operator<<(std::ostream&, Plan const&)'
testGrain.o: In function `TextSupport::dessine(Source const&)':
/home/INTRANET/mushkaev/myfiles/cpp/projet/marche/marche/TextSupport.h:18: undefined reference to `operator<<(std::ostream&, Source const&)'
testGrain.o:(.rodata._ZTI9GrainLJT1[_ZTI9GrainLJT1]+0x10): undefined reference to `typeinfo for GrainLJ'
GrainLJTUn.o: In function `GrainLJT1::GrainLJT1(Vecteur3D, Vecteur3D, double, double, SupportADessin*)':
/home/INTRANET/mushkaev/myfiles/cpp/projet/marche/marche/GrainLJTUn.cc:14: undefined reference to `GrainLJ::GrainLJ(Vecteur3D, Vecteur3D, double, double, SupportADessin*)'
GrainLJTUn.o: In function `GrainLJ::GrainLJ(GrainLJ const&)':
/home/INTRANET/mushkaev/myfiles/cpp/projet/marche/marche/GrainLJ.h:12: undefined reference to `vtable for GrainLJ'
collect2: error: ld returned 1 exit status
make: *** [testGrain] Error 1
这是代码:
testGrain.cc:
#include <iostream>
#include "Vecteur3D.h"
#include "GrainLJTUn.h"
using namespace std;
int main(){
Vecteur3D vitesse(1,2,3);
Vecteur3D position(2,3,4);
GrainLJT1 d(position,vitesse,5.0,9.0);
//cout << d;
return 0;
}
GrainLJ.h:
#ifndef PRJ_GRAINLJ_H
#define PRJ_GRAINLJ_H
#include <iostream>
#include <cmath>
#include "plan.h"
#include "Grain.h"
#include "Vecteur3D.h"
#include "SupportADessin.h"
#include <memory>
class GrainLJ : public Grain{ //GrainLJ n'est plus abstraite.
protected:
static double epsilon;// au cas j'ai mis une valeur au pif en attendant dans le .cc
static double sigma;
public:
virtual ~GrainLJ(){}
GrainLJ(Vecteur3D p = Vecteur3D(), Vecteur3D v = Vecteur3D(), double m = 0, double r = 0, SupportADessin* sup = nullptr);
double forceLJ(double eij) const;
void ajouteForce(GrainLJ*);
void ajouteForce(Vecteur3D);
void ajouteForce(Plan*);
virtual std::unique_ptr<GrainLJ> copie() const;
virtual void dessine() override{ if (support != nullptr) support->dessine(*this);}
};
std::ostream& operator<<(std::ostream&, GrainLJ const&);
#endif // PRJ_GRAINLJ_H
谷物LJT1
#ifndef PRJ_GRAINLJTUN_H
#define PRJ_GRAINLJTUN_H
#include "GrainLJ.h"
#include <iostream>
#include <memory>
#include "Vecteur3D.h"
class GrainLJT1 : public GrainLJ{
public:
~GrainLJT1(){}
GrainLJT1(Vecteur3D p = Vecteur3D(), Vecteur3D v = Vecteur3D(), double m = 0, double r = 0, SupportADessin* sup = nullptr);
virtual void dessine() override{
if(support != nullptr){
std::cout << "Grain LJ de type 2: ";
GrainLJ::dessine();
}
}
virtual std::unique_ptr<GrainLJ> copie() const override{return cloneMe();}
std::unique_ptr<GrainLJT1> cloneMe() const;
};
#endif // PRJ_GRAINLJTUN_H
如果这是太多的代码,我提前道歉,无法一次性发布。如果需要,我可以发布其他位。
编辑:
根据要求,以下是 TextSupport 和 Ggrain 的类定义。Grain 是一个抽象类,因为它继承了从Dessinable
(Drawable)dessine()
(绘制)的纯虚拟方法。后一个超类包含方法dessine()
,一个虚拟析构函数和protected
中的某个参数(指向SupportADessin(一个广义绘图类)的指针)。TextSupport是一个支持"文本绘制"的类,从某种意义上说,它包含不同"可绘制"类的不同绘制方法,例如GrainLJ,Plan和Source,它们都继承自Dessinable
。
#ifndef PRJ_TEXT_SUPPORT_H
#define PRJ_TEXT_SUPPORT_H
#include "SupportADessin.h"
#include "plan.h"
#include "Source.h"
#include <iostream>
#include "GrainLJ.h"
class TextSupport: public SupportADessin{
public:
~TextSupport() {}
void dessine(GrainLJ const& g) override{std::cout << g << std::endl;}
void dessine(Plan const& p) override{std::cout << p << std::endl;}
void dessine(Source const& s) override{std::cout << s << std::endl;}
};
#endif // PRJ_TEXT_SUPPORT_H
#ifndef PRJ_GRAIN_H
#define PRJ_GRAIN_H
#include "Vecteur3D.h"
#include "SupportADessin.h"
#include "Dessinable.h"
#include <memory>
class Grain: public Dessinable{ // j'ai enlevé l'opérateur de grain et remplacé grainLJ, vu que grain est abstrait.
public:
Grain(Vecteur3D position = Vecteur3D(), Vecteur3D vitesse = Vecteur3D(), double masse_vol = 0, double rayon = 0, SupportADessin* sup = nullptr);
~Grain(){}
double masse() const;
Vecteur3D get_pos() const;
Vecteur3D get_vit() const;
SupportADessin* get_sup() const;
double get_massev() const;
double get_rayon() const ;
double lambda() const;
void ajouteForce();
void bouger(double dt);
void set_vitesse(double x, double y, double z);
void set_rayon(double r);
//std::unique_ptr<Grain> cloneMe() const;
//virtual std::unique_ptr<Dessinable> copie() const;
protected:
Vecteur3D position;
Vecteur3D vitesse;
double masse_vol;
double rayon;
Vecteur3D force;
};
#endif // PRJ_GRAIN_H
所有从抽象类派生的类都必须实现纯虚函数。他们不能继承它并向前传递它。
解决方案是向每个派生类添加一个实现,或者使dessinable
函数只是虚拟的。
从抽象类派生类 (C++)
#ifndef PRJ_GRAINLJ_H
#define PRJ_GRAINLJ_H
#include <iostream>
#include <cmath>
#include "plan.h"
#include "Grain.h"
#include "Vecteur3D.h"
#include "SupportADessin.h"
#include <memory>
class Grain;//u lost this
class GrainLJ : public Grain{ //GrainLJ n'est plus abstraite.
protected:
static double epsilon;// au cas j'ai mis une valeur au pif en attendant dans le .cc
static double sigma;
public:
virtual ~GrainLJ(){}
GrainLJ(Vecteur3D p = Vecteur3D(), Vecteur3D v = Vecteur3D(), double m = 0, double r = 0, SupportADessin* sup = nullptr);
double forceLJ(double eij) const;
void ajouteForce(GrainLJ*);
void ajouteForce(Vecteur3D);
void ajouteForce(Plan*);
virtual std::unique_ptr<GrainLJ> copie() const;
virtual void dessine() override{ if (support != nullptr) support->dessine(*this);}
};
std::ostream& operator<<(std::ostream&, GrainLJ const&);
#endif // PRJ_GRAINLJ_H
相关文章:
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- C++引用错误
- 已定义函数时出现 G++ "未定义的引用"错误
- 链接 cmake 时出现未定义的引用错误
- 只有级联分类器会发出未定义的引用错误
- 2个模板化类的非模板友元函数未定义引用错误
- C/C++ 取消引用错误:在空检查之前取消引用
- 为什么我的C++代码无法编译,出现未定义的引用错误
- 我的代码中C++未定义的引用错误?
- 模板专用化会导致未定义的引用错误
- .cpp文件中未定义的引用错误
- c++ 中目录中文件的未定义引用错误
- Opencv4 使用 pkg-config 给出未定义的引用错误
- 使用Cygwin C++时出现未定义的引用错误,为什么我的文件没有链接?
- 共享指针取消引用错误
- 编译简单的多文件类程序时出现未定义的引用错误
- 模板函数产生未定义的引用错误
- 调用提取重加载器会产生对"运算符"的未定义引用错误>>
- 如何修复"未定义的引用"错误 opencv 和 g++
- 未定义的引用错误,我该怎么办?