2

编译程序时出现一些错误。它们与我的类指令的构造函数和析构函数有关。

错误是:

/tmp/ccSWO7VW.o: In function `Instruction::Instruction(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int)':
ale.c:(.text+0x241): undefined reference to `vtable for Instruction'
/tmp/ccSWO7VW.o: In function `Instruction::Instruction(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int)':
ale.c:(.text+0x2ab): undefined reference to `vtable for Instruction'
/tmp/ccSWO7VW.o: In function `Instruction::~Instruction()':
ale.c:(.text+0x315): undefined reference to `vtable for Instruction'
/tmp/ccSWO7VW.o: In function `Instruction::~Instruction()':
ale.c:(.text+0x38d): undefined reference to `vtable for Instruction'
collect2: ld returned 1 exit status

这是我的代码:

//classses.h

#include <iostream>
#include <string>
using namespace std;

class Instruction{

  protected:
    string name;
    int value;

  public:
    Instruction(string _name, int _value);
    ~Instruction();
    void setName(string _name);
    void setValue(int _value);
    string getName();
    int getValue();
    virtual void execute();
};

//constructor
Instruction::Instruction(string _name, int _value){
    name = _name;
    value = _value;
}
//destructor
Instruction::~Instruction(){
    name = "";
    value = 0;
}
void Instruction::setName(string _name){
     name = _name;
}

void Instruction::setValue(int _value){
    value = _value;
}

string Instruction::getName(){
       return name;
}

int Instruction::getValue(){
    return value;
}

///////////////////////////////////////// //////////////////

//ale.cpp

    #include "headers.h"
    #include "functions.h"
    #include "classes.h"
    #include <list>


    using namespace std;

    int main(){

    return 0;
    }
4

4 回答 4

8

我猜这个问题是由于您在指令类中声明了一个虚拟方法“执行”,并且从未在任何地方定义它。编译器必须为具有虚拟方法的类生成一个 vtable 对象,并且实际上只需要它的一个副本,因此他们通常只在定义第一个虚拟函数的编译单元(源文件)中执行它......

于 2009-11-14T22:47:14.357 回答
5

You did not define your virtual function and/or g++ wants you to make your destructor virtual (because you have virtual functions which assumes inheritance)

于 2009-11-14T22:45:25.957 回答
3

尝试

virtual void execute()=0;

这将使您的类抽象,这似乎是您想要的,因为未定义执行。

如果您想在多个 .cpp 文件中使用指令,则应将类方法的实现移动到 classes.cpp 文件中。

于 2009-11-14T22:55:48.017 回答
0

正如人们已经说过的那样,问题在于未实现的 execute() 。像 Dan Hook 所说的那样实现它,或者让它成为纯虚拟的。

只是一个额外的说明:在许多(可能大部分取决于您正在编码的内容)情况下,您不需要实现析构函数。如果您想要一些特定的功能(例如将数据刷新到文件),您只需要。

只要您没有指针(就像您的代码中的情况一样),您就不会有任何内存跟踪问题。只需删除析构函数:它是安全的,而且代码更少。但是,如果只有一个成员是指针,那么一切都会变得一团糟,您必须处理内存管理问题、内存泄漏和段错误;)

于 2009-11-14T23:07:14.660 回答