2012-06-09 80 views
0

我的項目有一些問題。下面是一些代碼:從基類和返回類型的模板繼承

class calcDinamica 
{ 
public: 
    virtual void somma() =0; 
    virtual void creaPrimo() =0; 
    virtual T* ritornaPrimo()const{cout<<"errore"<<endl;};//THIS is what i want 
    virtual ~calcDinamica(){}; 
}; 

template<class T> 
class calcolatrice:public calcDinamica 
{ 
private: 
    T* primoVett; //first operand 
    T* secondoVett; //second operand 
    T* risultatoVett; //result 
public: 
    calcolatrice():primoVett(0), secondoVett(0), risultatoVett(0){}; 
    virtual void creaPrimo(){primoVett= new T;}; 
    virtual void creaSecondo(){secondoVett= new T;}; 
    virtual void creaRisultato(){}; 
    virtual void somma() 
    { 
     risultatoVett=new T; 
     *risultatoVett=*primoVett+*secondoVett; 
    }; 
    virtual T* ritornaPrimo()const{cout<<"giusto"<<endl;return primoVett;}; 
}; 

此代碼是一個計算器,我還有其他3個不同的類,這些類我上面貼只跟蹤會話期間,我創建的數據,因爲我實現這與QT。

所以,我創建了這個基礎CalcDinamica只允許我有一個像calcDinamica * cal指針;然後創建它:calc = new calcolatrice < matrix>,因爲當我用QT使用計算器時,我可以改變我想操作的操作數的類型(如向量或矩陣)。

好的,這個工作,但我想返回calcolatrice內的數據,而不用calcDinamica的指針做很多dynamic_cast。 我該怎麼做,還是不可能?因爲如果不可能的話,我最好離開基類的這個選項,並且創建3個不同的calcolatrice。

在此先感謝。

回答

0

也許你應該添加「template<class T>」之前「class calcDinamica」和「class calcolatrice:public calcDinamica

+0

Thx,但不,如果我這樣做,基類的目的將會丟失,並且它變得毫無用處。這個純粹的基類的唯一目的是我可以聲明一個沒有T類型的指針,例如:calcDinamica * test;然後當我知道我想要使用什麼類型時,例如,使用test = new calcolatrice < matrix >創建新項目。然後,如果我使用test-> somma();它的工作原理,但我無法找到一種方法來檢索數據裏面沒有做一個「測試」指針dynamic_cast。我想找到一種像somma()這樣的類似方法的方法,能夠讓我回到calcolatrice的私有數據。 – user1446020

+0

好的,我知道。嘗試'類calcDinamica { public: virtual void somma()= 0; virtual void creaPrimo()= 0; template virtual T * ritornaPrimo()const {cout <<「errore」<< endl;}; //這就是我想要的 virtual〜calcDinamica(){}; };' – CodeSun

+0

我已經嘗試過了,可悲的是:錯誤:模板可能不是'虛擬'的。 :( – user1446020

0

如果使用多種類型的工作,你必須實現一個基類所有類型和使用的表述後加上「<T>」在AST中,對所有已評估的表達式進行類型檢查。