buona sera, dopo svariate ore di debugging mi arrendo, e chiedo aiuto.
Il codice sottostante durante l'esecuzione esplode, c'è stato un momento in cui funzionava perfettamente, poi ha deciso di morire

.
Durante il mio debugging mi sono accorto delle seguenti cose:
- modificando "srand(111222333);" in "srand(111222332);"
il codice funziona senza problemi, da qua la mia idea che qualcosa vada fuori scala.
- apparentemente il problema è nei costruttori
inoltre l'overloading dell'operatore << effettuato così va bene?
Spero che qualcuno possa aiutarmi, e se avete consigli sono ben accetti
#include <string>
#include <typeinfo>
#include <iostream>
#include <sstream>
#include <cmath>
#include <stdlib.h>
using namespace std;
class A{
private:
float x;
string st;
protected:
short getFirstVowel(){
for (int i=0;i < this->st.length();i++){
if((tolower(st[i])==st[i])&&(st[i]=='a'||st[i]=='e'||st[i]=='i'||st[i]=='o'||st[i]=='u')){
//cout << "CONTROLLO" <<st[i];
return i;
}
}
return -1;
}
public:
A(int *vec,short n){
//cout << "CONTROLLO__A\n";
for( int i=0;i<n;i++){
this->x += vec[i];
//cout << "CONTROLLO__Afine1\n"<<i<<"|" << n<<endl;
st+= ((char)vec[i]);
//cout << "CONTROLLO__Afine\n"<<i<<endl;
}
x/= n;
}
virtual int f()=0;
virtual ostream &put(ostream &os)const {
return os << "Class " << typeid(*this).name()<<": x=" << this ->x <<", st=" << this->st;
}
};
ostream &operator<<(ostream &os,const A &obj) {
return obj.put(os);
}
class B:public A{
private:
float *values;
short len;
public:
B(int *vec,short n):A(vec,n){
//cout << "CONTROLLO__B\n";
float *v=new float(n);
for (int i=0;i<n;i++){
v[i]=log(vec[i]);
}
len=n;
values=v;
}
int f(){
float min=values[0];
for(int i=1;i<len;i++){
min= ( min<values[i] ? min:values[i]);
}
return (round(min));
}
};
class C:public A{
private:
int i;
public:
C(int *vec,short n):A(vec,n){
//cout << "CONTROLLO__C\n";
i= (int)(vec[rand()% n]%50);
}
bool moreThan(int y){
return this->i<y ? this->i:y;
}
int f(){
return ((this->i) + (this->getFirstVowel()));
}
ostream &put(ostream &os)const {
return A::put(os) << "{ i="<< this ->i<<"}";
}
//C(int *vec,short n):A(vec,n){}
};
int main(){
srand(111222333);
int const DIM=30;
A *vett[DIM];
short l, select;
int *vec;
for(int i=0; i<DIM; i++){
l = rand()%8 + 5;
select = rand()%2;
vec = new int[l];
for(int c=0; c<l; c++)
vec[c] = 97 + rand()%25;
if(select)
vett[i] = new B(vec, l);
else
vett[i] = new C(vec, l);
}
cout << "Punto I (visualizzare gli oggetti):" <<endl;
int *min=new int(INT_MAX);
int *max=new int(INT_MIN);
float *avg=new float(0);
for (int i=0;i<DIM;i++){
//cout << "CONTROLLO";
cout << i << ")" << *vett[i] <<endl;
cout << "\tf()="<< vett[i]->f() <<endl;
*min= *min<vett[i]->f() ? *min: vett[i]->f();
*max= *max>vett[i]->f() ? *max: vett[i]->f();
*avg+= (vett[i]->f());
}
*avg/= DIM;
cout << "\n\n Punto II (minimo, media e massimo dei valori di f()):" <<endl;
cout << "min: " << *min <<", max:" <<*max <<", avg:"<< *avg<<endl;
//delete min, max,avg;
cout << "\n\nPunto III (indici degli oggetti per cui moreThan(10) e' true):" <<endl;
for (int i=0;i<DIM;i++){
if(typeid(*vett[i])==typeid(C) && ((C*)vett[i])->moreThan(10))
cout <<i << " ";
}
return 0;
}