Il motivo per cui questo non è possibile in C++, ma possibile in Java/Python è perché: in C++ vettore, di stoccaggio del contenitore STL (restituito da vector :: dati()) contiene tutte le istanze di oggetti sequencially confezionato. In cui ogni elemento deve avere la stessa dimensione. Questo rende l'indirizzamento rapido e conveniente. Pertanto, si supponga di definire una classe modello A,
template <class T>
class A{
int id;
T obj;
};
La sua dimensione dipenderà dalla variabile di modello "T obj". Spingere la stessa classe A di un diverso tipo di modello T renderà ogni elemento nel vettore di dimensioni diverse, quindi, questo è impossibile. L'unico modo è usare il vettore di shared_ptr o unique_ptr di una classe base. Sia shared_ptr che unique_ptr sono supportati da C++ 11 e Boost. Ogni elemento di classe derivata può avere diversi tipi di modello. In questo modo, quando viene chiamato il distruttore del puntatore della classe base, verrà richiamato il distruttore della classe derivata. Ad esempio,
#include <memory>
#include <vector>
#include <iostream>
#include <string>
using namespace std;
class A{};
template <class T>
class AImpl : public A{
public:
T obj;
AImpl(T _obj):obj(_obj){}
~AImpl(){
cout << "Deleting " << obj << endl;
}
};
int main(int argc, char** argv)
{
AImpl <string>* a1 = new AImpl <string> ("string1234");
AImpl <int>* a2 = new AImpl <int> (1234);
AImpl <double>* a3 = new AImpl <double> (1.234);
vector <shared_ptr<A>> As;
As.push_back(shared_ptr<A>(a1));
As.push_back(shared_ptr<A>(a2));
As.push_back(shared_ptr<A>(a3));
}
Ricordarsi di compilare con -std = C++ 11 per abilitare C++ 11.
uscita:
Deleting string1234
Deleting 1234
Deleting 1.234
E si ottiene ciò che si vuole! :)
In Java/Python, ogni variabile oggetto di classe è in realtà un puntatore, quindi, una matrice Java di A o una lista Python di A è equivalente a una matrice C++ di puntatori di A. Quindi, si ottiene essenzialmente la stessa funzionalità senza creare esplicitamente shared_ptrs.
Vuoi una riga per contenere, ad esempio, una cella, una cella e qualsiasi altro tipo di cella in un vettore <>? –
Skizz
Sì hai ragione. Lo voglio esattamente. –
significa che vuoi un contenitore polimorfico? è possibile utilizzare solo il polimorfismo dinamico (ereditarietà) e non il polimorfismo statico (modelli). – Elazar