如何用c ++中的类构建程序

时间:2012-11-14 17:59:52

标签: c++ makefile

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

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构造函数替换了纯虚析构函数

1 个答案:

答案 0 :(得分:0)

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

要修复编译错误,请添加

inline Element::~Element() {}

到Element.h。

(众所周知,您可以为纯虚函数提供定义。)

有一些关于在Herb Sutter的旧Guru of the Week中为纯虚拟提供定义的讨论。

另一方面:
我必须说,在这种情况下,拥有一个纯虚拟析构函数是没有意义的 - 我不能想到任何其他用途,而不是在没有任何其他虚函数时使类抽象。

最好的解决方案是完全抛弃Element的析构函数,因为它除了引起混淆之外没有任何其他目的。