0

我必须编写一个简单的类库。有两个类ElementPermutation

文件元素.h

#ifndef ELEMENT_H
#define ELEMENT_H

class Element
{
public: 
    virtual ~Element()=0;
    virtual bool IsEven()=0;
    virtual bool IsNeutral()=0;
};

#endif

文件排列.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 的 Permutation.cpp。类元素是抽象的,所以它没有任何实现的.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 包含 main 方法。)
错误:
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 类中用虚拟和删除的构造函数替换了纯虚拟析构函数

4

1 回答 1

0

即使你将析构函数设为纯虚拟,你仍然需要为它提供定义,否则子类的析构函数永远不能调用它,就像它必须的那样。

要修复编译错误,请添加

inline Element::~Element() {}

到 Element.h。

(您可以为纯虚函数提供定义,这一点并不为人所知。)

在Herb Sutter的本周老 Guru 中,有一些关于为纯虚拟提供定义的讨论。

另一方面:
我必须说,在这种情况下,拥有一个纯虚析构函数毫无意义——我想不出任何其他用途,除了在没有任何其他类的情况下使类抽象虚函数。

最好的解决方案是Element完全放弃 的析构函数,因为它除了引起混乱之外没有其他用途。

于 2012-11-14T18:39:47.733 回答