2

プログラムのコンパイル時にエラーが発生します。それらは私のクラスInstructionのコンストラクタとデストラクタに関連しています。

エラーは次のとおりです。

/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

問題は、Instructionクラスで仮想メソッド「execute」を宣言し、どこにも定義していないことが原因だと思います。コンパイラは、仮想メソッドを使用してクラスのvtableオブジェクトを生成する必要があり、実際にはそのコピーを1つだけ必要とするため、通常、最初の仮想関数を定義するコンパイルユニット(ソースファイル)で生成します...

于 2009-11-14T22:47:14.357 に答える
5

仮想関数を定義していないか、g ++でデストラクタを仮想化する必要があります(継承を想定した仮想関数があるため)

于 2009-11-14T22:45:25.957 に答える
3

試す

virtual void execute()=0;

これにより、クラスが抽象化されます。これは、executeが定義されていないため、意図したとおりのようです。

複数の.cppファイルでInstructionを使用する場合は、クラスメソッドの実装をclasses.cppファイルに移動する必要があります。

于 2009-11-14T22:55:48.017 に答える
0

すでに述べたように、問題は実装されていないexecute()があることです。それを実装するか、DanHookが言うように純粋に仮想化します。

補足:多くの場合(おそらくコーディングの内容によって異なります)、デストラクタを実装する必要はありません。特定の機能(たとえば、データをファイルにフラッシュする)が必要な場合に必要です。

ポインタがない限り(コードの場合のように)、メモリ追跡の問題は発生しません。デストラクタを削除するだけです。安全で、コードも少なくて済みます。ただし、1つのメンバーだけがポインターである場合、すべてが乱雑になり、メモリ管理の問題、メモリリーク、およびsegfaultsに対処する必要があります;)

于 2009-11-14T23:07:14.660 に答える