coldak píše:
takto si to chcel ?
Kód:
class VolumeData {
friend class iterator ;
public:
VolumeData() {
i = 4;
j = 5;
}
private:
int i,j;
public:
class iterator {
public:
int ii;
iterator() {
//data = 0;
}
void bla() {
VolumeData o;
ii = o.i;
}
};
};
To vyrobi uplne novu instanciu VolumeData, ktora nema s vnutornornou triedou nic spolocne.
Ono v C++ je vnutorna iba estestika, lebo su to uplne rozdielne triedy. Maju vyznam v oddelovani nazvov, aby sa programator lahsie vyznal.
johny3212 píše:
Vkladat jednu triedu do druhej je hnusny kod a nikde som sa s tym v praxi nestretol. Na co vlastne potrebujes take riesenie?
Ak si v triede pouzil deklaroval struct, tak si vlozil jednu triedu do druhej. Rozdiel medzi struct a class je iba ten, ze struct je defaultne public a class je private. To sa podla mna pouziva bezne... V Jave je to este nazornejsie, lebo tam je class jedina obdoba struktury...
coldak píše:
v jave to normalne funguje
http://java.skosi.org/javatutorial/sk/b ... nej-triedy .
bud ma C ine pravidla alebo mas niekde chybu ktora nieje rozpoznatelna z fragmentu sem vlozeneho kodu
edit: mozno fakt stacilo pridat direktivu friend pred iterator
V Jave to funguje inac. Samozrejme v C++ sa to da nasimulovat cez pointer. Aj iterator funguje v Jave inac (anonymne v foreach...). Pre C++ citaj dalej.
Friend nema v vnutornymi triedami nic spolocne. Iba spristupnuje privatne polozky jednej triedy druhej...
Par obecnych rad slov o svatej trojici, a iteratoroch v C++:
V danom priklade je pouzity deskrutor. Plati pravidlo svatej trojice, ked pretazuje destruktor, operator = alebo copy-konstruktor, skoro vzdy treba pretazit rovno vsetky tri.
V Jave ma kazda trieda svoj vlastny iterator, lebo vnutorna trieda je castou vonkajsiek a implicitne referenciu na vonkajsiu triedu. Ono v nej sa spravi iterator implementovanim rozhrania Iterable. V C++ su trieda (prevazne kontainer) a trieda iterator uplne osobitne instancie. Preto sa moze ten isty interator pouzit na prechadzanie vela kontainerov tej istej ... sablony (typu nie, lebo v sablone sa typy prisposobuju. Pokial neviete, co je sablona, mozte si predtavit aj typ).
Teda zaver, stopov problem sa da vyriesit ten explicitne predany pointer, ale implicitne, takou peknou fintou...
Kód:
#include <iostream>
class VolumeData {
public:
VolumeData():it(this) { }
private:
int xmax;
int ymax;
int zmax;
public:
class iterator {
private:
int pozicia;
VolumeData * self;
public:
iterator(VolumeData *vd): self(vd) { pozicia = 3;}
void nejakaFunkcia() {
pozicia = pozicia + self->xmax;
}
}iter;
};
kde
Kód:
iint main(void){
VolumeData v = new VolumeData;
v.iter.nejakaFunkcia(); //je to uz priamo iterator na objekt v
return 0;
}