2016-05-15 7 views
0

Ich studiere C++, und ich wollte fragen:Erstellen einer Vorlage mit Polymorphismus und op. Überladen in C++

Wie kann ich Klasse "Zeit" in einer Vorlage transformieren? Etwas wie:

template <class genericType> 
class time { 

Ich ist nicht gut in C++, und was ich möchte tun, andere Arten von Daten im Haupt verwenden, und nicht nur „int“, wie in dem folgenden Code.

Ich möchte so etwas wie machen:

time <char>t('a','a','a'); 
t.show(); 

er <char>t2('b','b','b'); 
t2.show(); 

time <char>t3=t+t2; 
t3.show(); 

Vielen Dank. Diese ist der Code, ich möchte in Vorlage verwandeln:

#include <iostream> 
using namespace std; 

class time{ 
protected: 

    int hour, minuts , seconds; 

public: 

    time(int x=0, int y=0, int z=0){ 
     hour=x; 
     minuts=y; 
     seconds=z; 
    } 
    virtual void show(){ 
     cout<<"it's "<<hour<<":"<<minuts<<":"<<seconds<<endl; 
    } 


    time operator+(time &te){ 

     cout<<"sum everything: "; 
     time bho; 
     bho.hour=hour+te.hour; 
     bho.minuts+=minuts+te.minuts; 
     bho.seconds+=seconds+te.seconds; 
     return bho; 
    } 

}; 

class er: public time { 

public: 

    er(int x=0,int y=0,int z=0):time(x,y,z){}; 

    void show() { 
    cout<< "Inside er: it's "<<hour<<":"<<minuts<<":"<<seconds<<endl; 
    }; 
}; 

int main() 
{ 

    time t(10,10,10); 
    t.show(); 

    er t2(20,20,20); 
    t2.show(); 

    time *pt= new er(60,60,60); 
    pt->show(); 

    time t3=t+t2; 
    t3.show(); 

    return 0; 
} 
+1

Kann mir jemand sagen, warum ich eine niedrige Bewertung zu meiner Frage erhalten habe? Ich lerne C++ und ich habe eine einfache Frage für etwas, das ich nicht wusste, wie getan. Wenn eine Person eine niedrige Bewertung für eine Frage erhält, nach der sie fragen, wozu dann diese Website? Vielen Dank. – andrea

Antwort

1

Es stimmt, Die Lösung von @serge Ballesta ist falsch. Vielleicht könnten Sie das versuchen:

#include <iostream> 
using namespace std; 

template <class genericType> 
class time{ 
protected: 

    genericType hour, minutes , seconds; 

public: 

    time(genericType x=0, genericType y=0, genericType z=0){ 
     hour=x; 
     minutes=y; 
     seconds=z; 
    } 
    virtual void show(){ 
     cout<<"it's: "<<hour<<":"<<minutes<<":"<<seconds<<endl; 
    } 

    time operator+(time &te){ 

     cout<<"sum everything: "<<endl; 
     time bho; 
     bho.hour=hour+te.hour; 
     bho.minutes+=minutes+te.minutes; 
     bho.seconds+=seconds+te.seconds; 
     return bho; 
    } 

}; 

template <class genericType> 
class er: public time <genericType>{ 

    public: 

    er(genericType x=0,genericType y=0, genericType z=0){ 
     time<genericType>::hour=x; 
     time<genericType>::minutes=y; 
     time<genericType>::seconds=z; 
    } 

    void show() { 
    cout<< "Inside er: it's "<<time<genericType>::hour<<":"<<time<genericType>::minutes<<":"<<time<genericType>::seconds<<endl; 
    }; 
}; 

int main() 
{ 
    time <char>t('a','a','a'); 
    t.show(); 

    er <char>t2('b','b','b'); 
    t2.show(); 

    time <char>t3=t+t2; 
    t3.show(); 

    return 0; 
} 
+0

Das funktioniert! Vielen Dank. Aber scheint ein wenig kompliziert. Es gibt eine andere einfachere Lösung als: "Zeit :: Stunde = x;" ??? – andrea

0

Lesen Sie einfach ein C++ Tutorial und fügen Sie die Magie template <class T> ...

Hier eine Templat-Version des Codes ist:

#include <iostream> 
using namespace std; 

template<class T> 
class time{ 
protected: 

    T hour, minuts , seconds; 

public: 

    time(T x=0, T y=0, T z=0){ 
     hour=x; 
     minuts=y; 
     seconds=z; 
    } 
    virtual void show(){ 
     cout<<"it's "<<hour<<":"<<minuts<<":"<<seconds<<endl; 
    } 


    time operator+(time &te){ 

     cout<<"sum everything: "; 
     time bho; 
     bho.hour=hour+te.hour; 
     bho.minuts+=minuts+te.minuts; 
     bho.seconds+=seconds+te.seconds; 
     return bho; 
    } 

}; 

template <class T> 
class er: public time<T> { 

public: 

    er(T x=0,T y=0,T z=0):time(x,y,z){}; 

    void show() { 
    cout<< "Inside er: it's "<<hour<<":"<<minuts<<":"<<seconds<<endl; 
    }; 
}; 

int main() 
{ 

    time<char> t('2', '2', '2'); 
    t.show(); 

    er<char> t2('1', '1', '1'); 
    t2.show(); 

    time<int> *pt= new er<int>(60,60,60); 
    pt->show(); 

    time<char> t3=t+t2; 
    t3.show(); 

    return 0; 
} 

NB: gebraucht I Zeichen '1' (Code 0x31) und '2' (Code 0x33), da die Summe 0x63 gibt, Charakter 'c' - vorausgesetzt, Sie verwenden ein ASCII-basiertes System

+0

Danke, aber diese Methode funktioniert nicht. Ich bekomme diesen Fehler: "Fehler: Klasse 'er ' hat kein Feld namens 'Zeit'" Dies ist nicht die richtige Lösung. Ich hatte bereits versucht, dies zu tun, aber ich habe diesen Fehler erhalten. So frage ich hier nach der richtigen Lösung. – andrea