2012-01-29 14 views
5

Io in realtà non so come descrivere questo, ma questo è il codice:Com'è possibile che una classe sia derivata da un modello specializzato su se stesso?

class A : public std::vector<A> 
{ 
}; 

//.... 

A a; 
a.push_back(a); 

Che cosa fa e perché si farebbe questo?

risposta

4

Questo è curiously recurring template pattern(CRTP).
Consente di implementare il polimorfismo statico .

Tuttavia, è una cattiva pratica utilizzare std::vector come classe base perché non ha un distruttore virtuale.

+0

Ho appena usato il vettore perché non volevo creare una classe template solo per dimostrare un punto :). Ma hai ragione. Lo esamineremo. Grazie –

0

La sottoclasse consiste nel terminare i generici. Il vettore può contenere solo oggetti di tipo A, non vettori arbitrari.

Ora, perché si sta costruendo un oggetto che contiene se stesso io lo so non. Ma ci sono dei motivi per farlo. Ad esempio, per il test delle unità, per garantire che un algoritmo sia in grado di gestire le raccolte contenenti loop. Un algoritmo ingenuo probabilmente si imbatterà in un ciclo infinito, quindi fallirà il test unitario.

1

Poiché è un vettore di A s e non A* s, a non può contenere sé stesso. Ma questo push_back aggiungerà al vettore una copia di a al momento della chiamata.

Esempio:

#include <vector> 
#include <iostream> 
using namespace std; 
class A : public std::vector<A> 
{ 
    public: 
     void print(int level=0){ 
      for (int i=0;i<level;i++) cout<<" "; 
      cout << "0x" << hex << (unsigned int)this << "=["; 
      if (size()){ 
       cout << endl; 
       for (int i=0; i<size(); i++) 
        (*this)[i].print(level+1); 
       for (int i=0;i<level;i++) cout<<" "; 
      } 
      cout <<"]"<<endl; 
      if(!level) cout << endl; 
     } 

}; 

int main(){ 
    A a; 
    for (int i=1;i<=3;i++){ 
     a.push_back(a); 
     a.print(); 
    } 
    return 0; 
} 

E l'output:

0xbff4fa20=[ 
    0x9ec2008=[] 
] 

0xbff4fa20=[ 
    0x9ec2018=[] 
    0x9ec2024=[ 
    0x9ec2038=[] 
    ] 
] 

0xbff4fa20=[ 
    0x9ec2048=[] 
    0x9ec2054=[ 
    0x9ec20a0=[] 
    ] 
    0x9ec2060=[ 
    0x9ec2080=[] 
    0x9ec208c=[ 
     0x9ec2008=[] 
    ] 
    ] 
] 
Problemi correlati