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ć?
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ć?
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.
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 –
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.
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=[]
]
]
]
domyślny skonstruowane 'std :: vector ' faktycznie nie zawierają Any'S, tak że jest cool. Czy wypróbowałeś drugie push_back? –
http://stackoverflow.com/questions/4173254/what-is-the-clyly-recurring-template-pattern-crtp –
@BoPersson Zrobiłem to teraz i to działa. –