[C++] Vector met pointers naar klassen

Pagina: 1
Acties:

  • LauPro
  • Registratie: Augustus 2001
  • Laatst online: 30-04 06:07

LauPro

Prof Mierenneuke®

Topicstarter
In een applicatie heb ik een aantal objecten. Deze objecten wil ik eigenlijk op gaan slaan in een soort array. Aangezien er per object een aantal acties e.d. kunnen worden uitgevoerd.

Nu heb ik begrepen dat hiervoor vectors kunnen worden gebruikt. Echter heb ik ook begrepen dat dit niet zo geschikt is om dan met pointers te werken.

Ik zal even de relevante code geven van de definities:
C++:
1
2
3
4
5
6
class module { 
public: 
    void test(); 
};

vector<module*> mod;
Wanneer de klasse wordt aangemaakt gaat dit middels een pointer omdat deze uit een plugin komt.

Wanneer er een aantal klassen 'in' de vector zijn gestopt dan kan ik wel het aantal uitlezen maar niet de functie test() aanroepen. De volgende code werkt niet correct bijvoorbeeld:
C++:
1
2
3
4
    
for(vector<module*>::iterator iter = mod.begin(); iter != mod.end(); iter++) {
    cout << *(iter)->test();
}
Dit geeft geen errors, alleen hij roept de functie test() helemaal niet aan. Hoe kan ik dergelijke functies aanroepen via een vector?

Inkoopacties - HENK terug! - Megabit
It is a war here, so be a general!


  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

Je hebt je haakjes verkeerd, (iter) heeft natuurlijk weinig nut, dat is hetzelfde als iter. Maar nu dereference je het resultaat van (iter)->test(), en dus moet je iter éérst dereferencen: (*iter)->test();

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • LauPro
  • Registratie: Augustus 2001
  • Laatst online: 30-04 06:07

LauPro

Prof Mierenneuke®

Topicstarter
Oke, echter als ik dat aan pas en het volgende doe:
C++:
1
2
3
for(vector<module*>::iterator iter = mod.begin(); iter != mod.end(); iter++) { 
    (*iter)->test(); 
}
Dan gebeurt er alsnog niets :? . Op het moment dat hij aan komt bij de tweede regel lijkt de functie wel abrupt de eindigen (ook in de debugger?).

Inkoopacties - HENK terug! - Megabit
It is a war here, so be a general!


  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

Weet je dat zeker? Ik denk dat je in de war bent omdat hij naar de niet geinlinede vector<T>::iterator::operator *() springt, alvorens test() aan te roepen.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • LauPro
  • Registratie: Augustus 2001
  • Laatst online: 30-04 06:07

LauPro

Prof Mierenneuke®

Topicstarter
Het is echter zo dat in vector<module*> mod een afgeleide klasse kan zitten. (Zie [rml][ C++] Met Libtool een klasse uit een module halen[/rml] )

Ik heb verschillende dingen geprobeerd, wat ik me kan voorstellen is bijvoorbeeld dit:
C++:
1
2
3
4
5
for(vector<module*>::iterator iter = mod.begin(); iter != mod.end(); iter++) {  
    cout << "start" << endl;
    (*(*iter))->test();  
    cout << "einde" << endl;
}
Op dit moment zie ik start nog verschijnen maar einde niet (zelfde bij eerder voorbeeld overigens).

Inkoopacties - HENK terug! - Megabit
It is a war here, so be a general!


  • LauPro
  • Registratie: Augustus 2001
  • Laatst online: 30-04 06:07

LauPro

Prof Mierenneuke®

Topicstarter
Ik heb sterk het vermoeden dat het te maken heeft met de extended klasse :( . De volgende code werkt namelijk wel correct:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
string *pint;
    
pint = new string("10");

vector<string*> iii;
iii.push_back(new string("1"));
iii.push_back(new string("3"));
iii.push_back(new string("3"));
iii.push_back(new string("7"));
iii.push_back(new string("4"));
iii.push_back(pint);
for (vector<string*>::iterator it = iii.begin(); it != iii.end(); it++ ) {
    cout << "hoi :) " << (*(*it)).c_str() << endl;
}

Inkoopacties - HENK terug! - Megabit
It is a war here, so be a general!


  • LauPro
  • Registratie: Augustus 2001
  • Laatst online: 30-04 06:07

LauPro

Prof Mierenneuke®

Topicstarter
:o

Ik heb een foutje gemaakt ;) . Vlak na de push_back van de moduleklasse in de vector werd het volgende gedaan:
C++:
1
2
m_exit(mod);
lt_dlclode(handle);
Wat er praktisch op neer komt dat alles dat de module heeft aangemaakt weer weg wordt gegooid :X . Na deze regels wat later uit te voeren werkt het allemaal perfect.

Inkoopacties - HENK terug! - Megabit
It is a war here, so be a general!


  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

waarom **iter (die extra set haakjes zijn overigens niet nodig)? Of heb je in module een operator-> gedefinieerd?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • LauPro
  • Registratie: Augustus 2001
  • Laatst online: 30-04 06:07

LauPro

Prof Mierenneuke®

Topicstarter
Nou ik ben haakjesfan ;) . Daarbij wil ik geen risico nemen dat iets me loopt te mierenneuken op een paar haakjes. Maar ik ben er idd achter gekomen dat *iter->test() ook werkt.

Inkoopacties - HENK terug! - Megabit
It is a war here, so be a general!

Pagina: 1