2017-02-09 7 views
1

初心者として、テンプレート、継承、および純粋仮想関数に関するいくつかの問題があります。特殊な純粋仮想テンプレート関数(定義されていない参照)の別の問題

ここで、確率は、RationalProbabilityとしてインスタンス化された抽象テンプレートです。

Probability.h:

template <class T> 
class Probability 
{ 
public: 
    T value; 
    //Operator overloading for + 
    virtual Probability<T>* operator+(const Probability<T>& p); 
    T getValue() const { return value; } 

protected: 
    Probability(T val) { 
     value = val; 
    } 
    ~Probability() {}; 
}; 

Probability.cpp:空

RationalProbability.h:

#include "Probability.h" 

class RationalProbability: public Probability<float> 
{ 
    public: 
     RationalProbability(float prob); 
     virtual ~RationalProbability(); 
     RationalProbability* operator+(const RationalProbability& p); 
}; 

RationalProbability.cpp:

#include "RationalProbability.h" 

RationalProbability::RationalProbability(float prob): Probability(prob) {} 

RationalProbability::~RationalProbability() 
{ 
} 

RationalProbability* RationalProbability::operator+(const RationalProbability& p) { 
    RationalProbability* rp = new RationalProbability(p.getValue() + this->value); 
    return rp; 
} 

私は次の取得ええROR:

Error:undefined reference to 
    Probability<float>::operator+(Probability<float> const&) 

(その正確なシグネチャを持つ機能がないことは事実ですが、抽象機能を持つように、基本クラスを使用する場合はRationalProbabilityは

RationalProbability: public Probability<float> 
+2

純仮想関数を指定していないため、実装が必要です。 –

+3

そして、 'operator +()'は動的に割り当てられたオブジェクトへのポインタを返します.... blech !!!これはJavaではありません。 – Peter

答えて

3

と正確にテンプレートを実装しますあなたが実装していない仮想関数)あなたはそう言う必要があります。

virtual Probability<T>* operator+(const Probability<T>& p) = 0; 

= 0はコンプを告げるものですそのメンバ関数は、サブクラスによってオーバーライドされなければならない抽象メソッドであること。

これがなければ、がすべての仮想関数の定義(実装)でなければなりません。


エラーメッセージをよく見ると、それはRationalProbability::operator+、ない不足しているProbability<float>::operator+だと言います。

また、operator+関数からポインタを返さないでください。read and check some canonical operator implementations、特にfor the binary arithmetic operatorsをお勧めします。オブジェクトを値で戻す必要があります。さもなければ、突然1つの追加の結果がポインタだったら、どうすればa + b + cのようなものが動作しますか?

関連する問題