Oltre a quello che ha detto Xaratroom, personalmente la trovo proprio assurda!
Domanda: è solo un esercizio o dovrebbe avere un uso pratico?
In ogni caso:
così come l'hai scritta, SetRange e GetRange avrebbero senso se fossero pubbliche, non private. Puoi usare direttamente le variabili a prescindere dalla visibilità delle funzioni.
In genere poi è meglio settare le variabili nella lista del costruttore.
codice:
Gen::Gen(int c, int s) : range(c) , seed(s)
{
// seed = s;
// SetRange(c); /* qui è inutile a prescindere se pubblica o privata */
srand(seed);
}
Poi allochi un puntatore *list e non metti un costruttore di copia per evitare che venga compiuta una delete due volte al termine dello scope di chiamata.
codice:
Gen a(10, 10);
Gen b = a; // copia bit a bit. Alla fine *list viene distrutto due volte
Infine la *GetList();
codice:
Gen a(10,20);
int* result = a.GetList(50);
delete result; // <-- chi dice che un int* sia un array?
E poi ogni chiamata a GetList alloca memoria che non verrà liberata che nel distruttore.
codice:
int *Gen::GetList(int n)
{
list = new int[n]; // <-- errore!!!
for(int i=0; i < n; i++)
{
list[i] = gen_casual();
}
return list;
}
.....................
Gen a(10,20);
int* result = a.GetList(50);
int* result1 = a.GetList(30);
int* result2 = a.GetList(5);
int* result3 = a.GetList(56);
Quattro allocazioni e solo una distruzione (forse)
per evitare sto spreco basta fare
codice:
std::vector<int> Gen::GetList(int n)
{
std::vector<int> v(n);
for(int i=0; i < n; i++)
{
v[i] = gen_casual();
}
return v;
}
e non si hanno memory leak.