PDA

View Full Version : [c++] problema con map (stl) e classe


czar
28-12-2009, 16:05
allora ho questa classe:
class KnowledgeBase
{
public:
KnowledgeBase();
KnowledgeBase(const char* kbFileName);
~KnowledgeBase();

void setFileName(const char* kbFileName);
void addObjectDescription(string utterance);
void showUserDescription();

private:
//< mela, <[rossa, ruvida], [verde]> >
map <string, vector< vector<string> > > userDescription;

char* kbFilename;

void tokenize_string(string utt, vector<string>& words);
void showStringVector(vector <string> strVec);
};


per aggiungere oggetti a userDescription chiamo:
void KnowledgeBase::addObjectDescription(string utterance)
{
vector<string> words;
tokenize_string(utterance, words);
string itemIndex;
itemIndex = *(words.end()-1);
words.pop_back();
userDescription[itemIndex].push_back(words);

//showUserDescription();
}
Notare la riga commentata sopra


void KnowledgeBase::showUserDescription()
{
if (userDescription.empty())
{
cout<<"doh!"<<endl;
}
for (map <string, vector< vector<string> > > :: iterator walkerMap = userDescription.begin(); walkerMap != userDescription.end(); walkerMap++)
{
cout<<"object <"<<walkerMap->first<<"> : ( ";
for (vector< vector<string> > :: iterator walkerVec = walkerMap->second.begin(); walkerVec != walkerMap->second.end()-1; ++walkerVec )
{
showStringVector(*walkerVec);
cout<<", ";
}
showStringVector(*(walkerMap->second.end()-1));
cout<<" )"<<endl;
}
cout<<endl;

}



il problema è che se decommento la linea sopracitata e chiamo showUserDescription dalla funzione addObjectDescription, funziona perfettamente.
KnowledgeBase kbase("KnowledgeBase.txt");
kbase.addObjectDescription(string().assign(t_utt));

e ad ogni chiamata di addObjectDescription viene visualizzata correttamente tutta la struttura creata.

Mentre se invece la chiamo dall'esterno con:
kbase.showUserDescription();
la struttura userDescription risulta vuota (e viene visualizzato "doh" ç_ç)


Perchè accade ciò e userDescription risulta vuota? Quando invece dovrebbe essere piena, dato che ad ogni chiamada di addObj... la struttura ha sia gli elementi precedenti che quelli appena aggiunti? Dove sbaglio?

cionci
29-12-2009, 08:12
Prova a stampare "this" all'interno di showUserDescription. A meno che tu non abbia fatto qualche passaggio per valore l'indirizzo dovrebbe essere lo stesso in entrambi i casi.

czar
29-12-2009, 10:52
Prova a stampare "this" all'interno di showUserDescription. A meno che tu non abbia fatto qualche passaggio per valore l'indirizzo dovrebbe essere lo stesso in entrambi i casi.

ho provato a mettere:
if (this->userDescription.empty())
{
cout<<"doh!"<<endl;
}
ma lo vede sempre come vuoto


ed anche:
this->userDescription[itemIndex].push_back(words);

ma il risultato non cambia :(

cionci
29-12-2009, 10:54
Prova a mettere una stampa di this ;)

cout << (unsigned int)this;

dentro a showUserDescription. Magari fai qualche passaggio per cui alla fine operi su istanze diverse.

czar
29-12-2009, 11:14
niè scusate se vi ho fatto perdere tempo, ho trovato l'errore che era da un altra parte... ç_ç

cionci
29-12-2009, 11:22
ho trovato l'errore che era da un altra parte... ç_ç
Ci avevo beccato allora :D Scommetto che mancava un passaggio per riferimento.

czar
29-12-2009, 11:35
Ci avevo beccato allora :D Scommetto che mancava un passaggio per riferimento.

in pratica dichiaravo KnowledgeBase kbase come membro di una classe, e poi stupidissimamente andavo a ricrearla con lo stesso nome di kbase nel main, dove ovviamente era vuota in quanto gli oggetti venivano aggiunti nel membro ma non nella dichiarazione nel main... proprio un errore da nubbio... ç_ç
la svista derivava dal fatto che il main era nello stesso file del cpp da dove veniva chiamata addObj... mi devo attaccare sul pc un post-it con scritto "non distrarti" *_*