我必须编写一个简单的类库。有两个类Element
和Permutation
。
File Element.h
#ifndef ELEMENT_H
#define ELEMENT_H
class Element
{
public:
virtual ~Element()=0;
virtual bool IsEven()=0;
virtual bool IsNeutral()=0;
};
#endif
文件Permutation.h
#ifndef PERMUTATION_H
#define PERMUTATION_H
#include "Element.h"
class Permutation: public Element
{
private:
int* numbers;
public:
const int k;
Permutation(const int, int*);
Permutation(const int);
Permutation();
~Permutation();
int NumberOfInversions();
bool IsEven();
bool IsNeutral();
friend Permutation operator+(const Permutation&, const Permutation&);
friend Permutation operator-(const Permutation&);
};
#endif
我有Permutation.cpp实现类Permutation。类元素是抽象的,因此它没有任何带有实现的.cpp文件。所以,我想编写一个使用类Permutation的简单测试程序(使用main)。我应该如何建立我的项目?我在linux平台上使用g ++编译器。
这是我的Makefile不起作用:
all: permutation_test
permutation_test: fuf.o Permutation.o
g++ fuf.o Permutation.o -o permutation_test
fuf.o: fuf.cpp
g++ -c fuf.cpp
Permutation.o: Permutation.cpp
g++ -c Permutation.cpp
clean:
rm -rf *o permuatation_test
(fuf.cpp包含主要方法。)
错误:
Permutation.o:在函数«Permutation :: Permutation(int,int *)»中:
Permutation.cpp :(。text + 0xd):未定义的引用«Element :: Element()»
Permutation.o:在函数«Permutation :: Permutation(int)»中:
Permutation.cpp :(。text + 0x3c):未定义的引用«Element :: Element()»
Permutation.cpp :(。text + 0xac):未定义的引用«Element :: ~Element()»
Permutation.o:在函数«Permutation :: Permutation()»中:
Permutation.cpp :(。text + 0xcd):未定义的引用«Element :: Element()»
Permutation.o:在函数«Permutation ::〜Permutation()»中:
Permutation.cpp :(。text + 0x11e):未定义的引用«Element :: ~Element()»
collect2:错误:ld返回1退出状态
现在有效。谢谢你的回复。我刚刚用类Element
中的virtual和deleted构造函数替换了纯虚析构函数答案 0 :(得分:0)
即使你将析构函数设置为纯虚拟,你仍然需要为它提供一个定义,否则子类'析构函数永远不能像它一样调用它。
要修复编译错误,请添加
inline Element::~Element() {}
到Element.h。
(众所周知,您可以为纯虚函数提供定义。)
有一些关于在Herb Sutter的旧Guru of the Week中为纯虚拟提供定义的讨论。
另一方面:
我必须说,在这种情况下,拥有一个纯虚拟析构函数是没有意义的 - 我不能想到任何其他用途,而不是在没有任何其他虚函数时使类抽象。
最好的解决方案是完全抛弃Element
的析构函数,因为它除了引起混淆之外没有任何其他目的。