Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it L'avatar di Kilin
    Registrato dal
    Mar 2003
    Messaggi
    453

    [C++] domanda sui templates...

    ciao a tutti...

    vorrei chiedervi una cosa riguardo ai templates, non so se sia possibile sta cosa che ho in mente di fare (ecco perchè sono qui a chiedere a voi )

    In pratica: mettiamo che abbia una classe "uno" template, tipo questa:

    codice:
    template<class tipo>
    class uno
    {
          tipo a;
    };
    Derivata da questa uno, ho una classe "due", in cui non mi interessa il parametro di template. Derivate dalla classe due ho diverse sottoclassi, ed è per quelle che mi interessa il template.

    La domanda è: c'è uno modo di non istanziare il template a livello della classe due, per poi istanziarlo nelle varie sotto classi? non so se mi sono spiegato...

    perchè non metti il campo "tipo a"nella classe due potreste chiedere... beh non posso perchè per logica quel campo deve stare nella classe "uno"

    spero di essermi spiegato....!

    grazie a tutti..

  2. #2
    Utente di HTML.it L'avatar di Kilin
    Registrato dal
    Mar 2003
    Messaggi
    453
    codice:
    template<class LabelType>
    class uno
    {
        public:
                LabelType label;  
    };
    
    template<class LabelType>
    class due: public uno<LabelType>
    {
        
    };
    class tre : public  due<int>
    {
          tre() : label(2) {};
    };
    così potrebbe andare? mi da errore però nella classe tre, dice che non ha un campo label... ho provato a scrivere uno<int>::label(2) nella lista di inizializzatori ma da un altro errore... se lo metto nel corpo del costruttore invece è ok..

  3. #3
    Prova così:

    Codice PHP:
    template<class LabelType>
    class 
    uno
    {
        public:
        
    LabelType label;
        
    uno (LabelType theLabel) : label (theLabel) {};
    };

    template<class LabelType>
    class 
    due: public uno<LabelType>
    {
        public:
        
    due (LabelType theLabel) : uno <LabelType>(theLabel) {};
    };

    class 
    tre : public due<int>
    {
        public:
        
    tre() : due <int>(2) {};
    }; 

  4. #4
    Utente di HTML.it L'avatar di Kilin
    Registrato dal
    Mar 2003
    Messaggi
    453
    grazie per la risposta... ero arrivato a quella soluzione, ma ho un altro problema... a me servirebbe avere dei puntatori alla classe base, con cui punto oggetti di tutta la gerarchia sfruttando il polimorfismo.. il fatto è che le sottoclassi istanziano classi template diverse a seconda del tipo LabelType, e il c++ vuole che io dichiari ad esempio "uno<int>* pun", mentre quel puntatore mi dovrebbe poter puntare a qualsiasi sotto classe... c'è un modo di risolvere?

  5. #5
    Puoi derivare da una classe "zero". Ad esempio:

    Codice PHP:
    //
    // Compiled and tested with:
    // i686-apple-darwin8-g++-4.0.1 (GCC) 4.0.1 (Apple Computer, Inc. build 5367)
    //
    // g++ -Wall -ansi -pedantic main.cpp
    //
    // output:
    // 2
    // ciao
    //

    #include <iostream>

    class zero{
        public:
        
    virtual void DoIt () = 0;
        
    virtual ~zero (){};
    };

    template<class LabelType>
    class 
    uno: public zero
    {
        public:
        
    LabelType label;
        
    uno (LabelType theLabel) : label (theLabel) {};
        
    virtual void DoIt (){
            
    std::cout << label << std::endl;
        }
        
    virtual ~uno (){};
    };

    template<class LabelType>
    class 
    due: public uno<LabelType>
    {
        public:
        
    due (LabelType theLabel) : uno <LabelType>(theLabel) {};
        
    virtual ~due (){};
    };

    class 
    tre : public due<int>
    {
        public:
        
    tre() : due<int>(2) {};
        
    virtual ~tre (){};
    };

    int main (){
        
    zero aZero = new tre;
        
    zero aOnotherZero = new due <std::string> ("ciao");
        
    aZero->DoIt ();
        
    aOnotherZero->DoIt ();
        
    delete aOnotherZero;
        
    delete aZero;
        return 
    0;


Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.