Questo il codice completo:
codice:
#include <iostream>
#include <vector>
#include <memory>
using namespace std;
class Materiale {
public:
virtual double get_E() {
return 0.;
}
};
class Acciaio : public Materiale {
double E;
public:
Acciaio(){
E=210000.;
}
double get_E(){
return E;
}
};
/* eventuale altro materiale*/
/*class Acciaio2 : public Materiale {
double E;
public:
Acciaio(){
E=100000.;
}
double get_E(){
return E;
}
};
*/
class Nodo {
std::unique_ptr<Materiale> mat;
//inizio costruttori e funzioni
public:
Nodo() {
}
/**/
double get_E() {
return mat->get_E();
}
void set_materiale(Materiale &m){
mat.reset(&m);
}
};
class Elemento {
public:
std::vector<Nodo> nodo;
//inizio costruttori e funzioni
public:
Elemento() {
}
double get_E() {
double E=0.;
for(int i=0;i<nodo.size();i++){
E=E+nodo[i].get_E();
}
return E/nodo.size();
}
};
int main()
{
std::vector<Elemento> elemento;
std::vector<Acciaio> acciaio;
elemento.emplace_back(Elemento());
elemento[0].nodo.emplace_back(Nodo());
elemento[0].nodo.emplace_back(Nodo());
for(int i=0;i<elemento.size();i++) {
for(int k=0;k<elemento[i].nodo.size();k++) {
acciaio.emplace_back(Acciaio());
elemento[i].nodo[k].set_materiale(acciaio[i]);
}
}
for(int i=0;i<elemento.size();i++) {
for(int k=0;k<elemento[i].nodo.size();k++) {
std::cout<<elemento[i].nodo[k].get_E()<<"\n";
}
}
return 0;
}
emplace o non emplate, std::unique_ptr<Materiale> mat; o std::unique_ptr<Materiale> mat(NULL); o std::unique_ptr<Materiale> mat();
non funziona... (fate un rapido copia e incolla per vedere!) ... io proprio non so' più che santi chiamare! 
non ho mai perso tanto tempo dietro a un problema come questa volta...
Nella realtà è tanto semplice: Tanti oggetti che contengono tanti oggetti che possono collegarsi ad altri oggetti (diversi, la cui classe madre è la classe Materiale).