2016-03-19 12 views
-3

私は初心者でC++を学ぼうとしています。私は次の問題を解決しようとしています。私は何が問題を引き起こしているのか分かりません。この抽象クラスからサブクラスを作成するにはどうすればよいですか? Vtable Error

これは私がして提供しています抽象クラスです:

#ifndef __EXPR_H__ 
#define __EXPR_H__ 
#include <string> 

class Expr { 
public: 
    virtual int eval() const = 0; 
    virtual std::string prettyPrint() const = 0; 
    virtual ~Expr(); 
}; 
#endif 

私はこのクラスのサブクラスを作成しようとしています、私の.hファイルは、私の実装が、これ

#ifndef __NUM_H__ 
#define __NUM_H__ 

#include <iostream> 
#include "expr.h" 

//class of lone expression 
class Num:public Expr 
{ 
private: 
    int operand; 
public: 
    Num(int operand):operand(operand){} 
    int eval() const; 
    std::string prettyPrint() const; 
    ~Num(){} 
}; 
#endif 

のように見えますNumクラスはこのように見えます

#include "num.h" 
#include <sstream> 

std::string Num::prettyPrint() 
{ 
    std::stringstream convert; 
    convert << operand; 
    return convert.str(); 
} 

int Num::eval() 
{ 
    return operand; 
} 

次のエラーが発生します。何が原因なのか分かりません。

Undefined symbols for architecture x86_64: 
    "vtable for Num", referenced from: 
     Num::Num(int) in rpn-dc20fb.o 
    NOTE: a missing vtable usually means the first non-inline virtual member function has no definition. 
    "vtable for Expr", referenced from: 
     Expr::Expr() in rpn-dc20fb.o 
    NOTE: a missing vtable usually means the first non-inline virtual member function has no definition. 
ld: symbol(s) not found for architecture x86_64 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

助けていただければ幸いです。ありがとう!

答えて

1

仮想デストラクタが

virtual ~Expr() { } 

コンパイラは(純粋又はない)仮想デストラクタ与えられた仮想テーブルを構築しようとする実装を必要とし、それが実装を見つけることができないので、それは文句を言います。 P0Wによって機能「評価」を指定し、「prettyPrint」が「num.cc」の「CONST」として定義される必要があるほか

1

std::string Num::prettyPrint() const 
{ 
    std::stringstream convert; 
    convert << operand; 
    return convert.str(); 
} 

int Num::eval() const 
{ 
    return operand; 
} 
関連する問題