2012-01-29 15 views
5

ja naprawdę nie wiem, jak opisać to, ale jest to kod:Jak można wyprowadzić klasę z szablonu specjalizującego się w sobie?

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

//.... 

A a; 
a.push_back(a); 

Co to robi i dlaczego chcesz to zrobić?

Odpowiedz

4

To jest curiously recurring template pattern(CRTP).
Umożliwia implementację statycznego polimorfizmu .

Jednak niewłaściwą praktyką jest używanie std::vector jako klasy bazowej, ponieważ nie ma ona wirtualnego destruktora.

+0

Właśnie użyłem wektora, ponieważ nie chciałem stworzyć klasy szablonów tylko po to, aby udowodnić punkt :). Ale masz rację. Zajrzę do tego. Dzięki –

0

Podklasa służy do zakończenia generycznych. Wektor może zawierać tylko obiekty typu A, a nie arbitralne wektory.

Teraz, dlaczego budujesz obiekt zawierający siebie, robię , a nie wiem. Ale są ku temu powody. Na przykład w przypadku testów jednostkowych, aby zapewnić obsługę algorytmów kolekcji zawierających pętle. Naiwny algorytm prawdopodobnie uruchomi się w nieskończonej pętli, a więc nie przejdzie testu jednostkowego.

1

Ponieważ jest to wektor A s, a nie A* s, a nie może sam siebie zawierać. Ale ten push_back doda do wektora kopię a w momencie połączenia.

Przykład:

#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; 
} 

a wyjście:

0xbff4fa20=[ 
    0x9ec2008=[] 
] 

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

0xbff4fa20=[ 
    0x9ec2048=[] 
    0x9ec2054=[ 
    0x9ec20a0=[] 
    ] 
    0x9ec2060=[ 
    0x9ec2080=[] 
    0x9ec208c=[ 
     0x9ec2008=[] 
    ] 
    ] 
] 
Powiązane problemy