| | |
| Stránka: 1 z 1
| [ Príspevkov: 17 ] | |
Autor | Správa |
---|
Registrovaný: 19.09.06 Prihlásený: 17.01.24 Príspevky: 749 Témy: 31 Bydlisko: Ružomberok&... |
dostal som kod, do ktoreho mam nieco dopisat, ale stale mi pise error.
Kód: class VolumeData { public: VolumeData() {...}; ~VolumeData() {...}; private: int xmax; int ymax; int zmax; . . . public: class iterator { private: int pozicia; public: nejakafunkcia() { pozicia = pozicia + xmax; } } }
v skratke mam triedu v triede a ked sa pokusim v tej "vnutornej" triede pristupi k polozke tej nadradenej triedy, tak pri kompilacii vypise k riadku kde sa snazim pricitat xmax k pozicii : Kód: error: invalid use of nonstatic data member in line...
co s tym?
|
|
Registrovaný: 11.01.09 Prihlásený: 28.03.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 11.11.2010 18:04 | |
|
Neviem, či sa to dá vyriešiť bez väčšieho prerobenia kódu. Píšeš, že si ten kód dostal, takže by to malo ísť skompilovať alebo tá časť kódu, ktorú si tu vložil, už je modifikovaná? Ak si už niečo vkladal (hlavne tú vnorenú triedu), tak to zrejme musíš upraviť nejako inak. Z triedy iterator nemôžeš pristupovať do triedy VolumeData, nakoľko to sú oddelené triedy. Riešením by mohlo byť využitie statickej premennej/funkcie prípadne friend funkcie a pod.
|
|
Registrovaný: 19.09.06 Prihlásený: 17.01.24 Príspevky: 749 Témy: 31 Bydlisko: Ružomberok&... | Napísal autor témy stopa27: 11.11.2010 18:07 | |
|
pisem to tak ako som dostal, iba tie premenne boli deklarovane ako static, co mi nevyhovovalo. Co by ale mozno ani nebol problem ked tak nad tym rozmyslam. Ta vnorena trieda tam uz bola.
|
|
Registrovaný: 11.01.09 Prihlásený: 28.03.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 12.11.2010 10:26 | |
|
Tak potom chápem, ak boli static, fungovalo to správne, nakoľko nie je nutná inštancia triedy VolumeData. Ak ich nechceš mať ako static, tak takto s vnorenou triedou si nie som istý či to pôjde (možno s použitím friend). Ak by si neprišiel na žiadne riešenie, večer sa na to môžem pozrieť. // pridané po 15 hodinách 53 minútach od posledného príspevku Tak som sa na to trocha pozrel a napadlo ma zatiaľ len jedno: Ak chceš použiť vnorenú triedu a zároveň dátové členy v triede VolumeData nemajú byť statické, tak pri vytváraní inštancie triedy Iterator musíš už mať inštanciu triedy VolumeData. Potom v konštruktore triedy Iterator bude ako parameter smerník na inštanciu triedy VolumeData. Vyzeralo by to nejako takto:
Kód: // trieda iterator
class iterator { private: int pozicia; public: VolumeData* owner; iterator( VolumeData* i ) { owner = i; } // ... };
// main
VolumeData x; // nutna instancia tejto triedy VolumeData::iterator y( &x ); // a predanie smernika tejto instancie triede iterator cout << y.owner->getXMAX() << endl; // getXMAX() je clenska funkcia triedy VolumeData, vracia xmax
Ak nevyhovuje ani toto riešenie, napíš čo a nejak to upravíme.
|
|
Registrovaný: 19.09.06 Prihlásený: 17.01.24 Príspevky: 749 Témy: 31 Bydlisko: Ružomberok&... | Napísal autor témy stopa27: 12.11.2010 12:15 | |
|
Dik, ale nakolko ide o kod, ktory tak ci tak neskor bude musiet byt prepisany do cisteho C a openCL, netreba sa tam hrat na kadejake pekne konstrukcie jazyka (a zaroven je to mozne z ohladom na pouzitie tej triedy, nebude sa to bit - je tam VZDY iba jedna instancia), tak som to vyriesil jednoduchym pridanim globalnych premennych, ktore nastavujem v konstruktore VolumeData() a ktore sa pouzivaju namiesto tych m_maxX/Y/Z.
|
|
Registrovaný: 29.10.08 Prihlásený: 30.07.12 Príspevky: 933 Témy: 2 | Napísal coldak: 12.11.2010 12:31 | |
|
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
Naposledy upravil coldak dňa 12.11.2010 12:48, celkovo upravené 1
|
|
Registrovaný: 19.09.06 Prihlásený: 17.01.24 Príspevky: 749 Témy: 31 Bydlisko: Ružomberok&... | Napísal autor témy stopa27: 12.11.2010 12:47 | |
|
to je mozne ze tam mam chybu, C++ sa nevenujem, ale za 700 riadkovy program by ste sa mi tu nepodakovali
Kazdopadne na tomto kratuckom kode je demonstrovany moj problem (ktory uz nie je problem, len pre zaujimavost pravdepodobne)
Kód: #include <stdio.h>
class VolumeData { public: VolumeData() { i = 4; j = 5; } private: int i,j; public: class iterator { public: int ii; iterator() { //data = 0; } void bla() { ii = i; } }; };
int main() { VolumeData dd; return 0; }
|
|
Registrovaný: 29.10.08 Prihlásený: 30.07.12 Príspevky: 933 Témy: 2 | Napísal coldak: 12.11.2010 13:42 | |
|
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; } }; };
|
|
Registrovaný: 02.11.07 Prihlásený: 18.03.15 Príspevky: 470 Témy: 22 Bydlisko: Zilinska Un... |
Vkladat jednu triedu do druhej je hnusny kod a nikde som sa s tym v praxi nestretol. Na co vlastne potrebujes take riesenie?
_________________ Notebook: HP EliteBook 8740w
You can see my work in my www |
|
Registrovaný: 19.09.06 Prihlásený: 17.01.24 Príspevky: 749 Témy: 31 Bydlisko: Ružomberok&... | Napísal autor témy stopa27: 12.11.2010 19:41 | |
|
Este raz sa opakujem, nekodil som to ja, neviem preco to autor napisal prave takto. Uz to nema zmysel riesit, vyriesil som to uplne inym sposobom. Tento kod som z ohladom na buduci vyvoj programu zahodil.
|
|
Registrovaný: 02.07.06 Prihlásený: 28.03.24 Príspevky: 14180 Témy: 312 Bydlisko: Bratislava |
ak mozem OT. Ucim sa JAVU/C# a o triede v triede som uz nieco cital. Takze sa chcem spytat. Je to vazne hnusny zlozvyk a mozem to kludne pustit z hlavy, alebo v tom mam hladat nejake prakticke vyuzitie ?
_________________ PODPIS BOL UPRAVENÝ / ZMAZANÝ Z DÔVODU PORUŠOVANIA PRAVIDIEL FÓRA! |
|
Registrovaný: 19.09.06 Prihlásený: 17.01.24 Príspevky: 749 Témy: 31 Bydlisko: Ružomberok&... | Napísal autor témy stopa27: 12.11.2010 22:25 | |
|
hore v tom linku mas opisany popis na co by sa to dalo vyuzit
|
|
Registrovaný: 16.02.08 Prihlásený: 08.12.10 Príspevky: 235 Témy: 13 | Napísal ado21: 13.11.2010 3:39 | |
|
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; }
_________________ Učet je neaktívny. |
|
Registrovaný: 02.11.07 Prihlásený: 18.03.15 Príspevky: 470 Témy: 22 Bydlisko: Zilinska Un... |
Nemusis vysvetlovat struct a class a navyse co to tu pleties? Je to to iste a taktiez by sa nemali pouzivat naraz, ked robis v c++ tak pouzivaj class a neplet tam struct. Da sa to urcite vyriesit prostrednictvom dedicnosti. Java ale nema viacnasobnu dedicnost. Takze do c++ to nepatri si myslim.
_________________ Notebook: HP EliteBook 8740w
You can see my work in my www |
|
Registrovaný: 16.02.08 Prihlásený: 08.12.10 Príspevky: 235 Témy: 13 | Napísal ado21: 13.11.2010 11:51 | |
|
johny3212 píše: Nemusis vysvetlovat struct a class a navyse co to tu pleties? Je to to iste a taktiez by sa nemali pouzivat naraz, ked robis v c++ tak pouzivaj class a neplet tam struct. Da sa to urcite vyriesit prostrednictvom dedicnosti. Java ale nema viacnasobnu dedicnost. Takze do c++ to nepatri si myslim.
Nerouziem. napisal si, ze vkladat jednu triedu do druhej je hnus. Hold, nemas na vyber, ked si chces v triede spravit kompikovanejsi typ. Uz len jednoduchy strom, tak v triede budes mat strukturu na uzol...
Dalej iterator je uplne typicky priklad, ktory sa deklaruje ako vnutorna trieda, typicky v sablonach... Trieda v triede sa pouziva bezne v kazdom jazyku... Ak sa nikde nestretol s deklarovanim struct/class v praxi, tak si mam o tvojej praxi silne pochybnosti. Zvlast ak tu vravis take veci, ako vravis...
_________________ Učet je neaktívny. |
|
Registrovaný: 02.11.07 Prihlásený: 18.03.15 Príspevky: 470 Témy: 22 Bydlisko: Zilinska Un... |
Nodporuca sa to miesat struct/class, casto sa s tym stretavam, ale nemalo by so to pouzivat. Vravim, ze som sa nestretol moc s triedou v triede .
A iterator sa robi uplne inak.
Kód: class ViewG { public:
ViewG(); virtual ~ViewG();
typedef std::vector<boost::shared_ptr<ViewCreator> >::iterator Iterator; typedef std::vector<boost::shared_ptr<ViewCreator> >::reverse_iterator ReverseIterator;
private: std::vector<boost::shared_ptr<ViewCreator> > _viewportCreator;
public: //funkcie pre iterator . . . };
//samotna trieda s funkciami ktore sa volaju class ViewCreator { private: . . . public: . . .
};
toto je jedeno z mnoha rieseni ako sa to da krasne spravit . Ale to je nazor kazdeho, mne sa iba tamto riesenie, co mas ty nepaci v C++. Ale toto je ukazka na pouzitie iteratorov vektora.
_________________ Notebook: HP EliteBook 8740w
You can see my work in my www |
|
Registrovaný: 16.02.08 Prihlásený: 08.12.10 Príspevky: 235 Témy: 13 | Napísal ado21: 13.11.2010 12:32 | |
|
Ano.
No i tiez pride uplne prirodzene.
Kód: class Strom { struct uzol { int hodnota; uzol *dalsi; }; public: Strom(); Strom(Strom & S); void vloz(int i); void delete(int i); void vypis(); operator =(); . . . protected: virtual ~Strom(); . . . };
Na co davat uzol von, ak je mu nejlepsie privatnemu? A realne sa v .cpp vsetko pise oddelene
_________________ Učet je neaktívny. |
|
| Stránka: 1 z 1
| [ Príspevkov: 17 ] | |
Podobné témy | Témy | Odpovede | Zobrazenia | Posledný príspevok |
---|
| Visual C++ 2008 použitie classu z class library v Assembler, C, C++, Pascal, Java | 0 | 244 | 19.11.2011 14:29 Loko11 | | MicroSDHC class 2 alebo class 4 mám vrátiť ? v Pamäte | 3 | 664 | 16.12.2010 20:09 majky358 | | Mám sa učiť C ++/objective C/ C#? v Assembler, C, C++, Pascal, Java | 5 | 724 | 08.07.2014 20:40 XOLOO | | class PHPMailer v PHP, ASP | 3 | 313 | 30.09.2012 12:19 shaggy | | Delphi class v Delphi, Visual Basic | 1 | 783 | 10.09.2009 16:35 Fico | | User Class v Redakčné systémy | 3 | 505 | 06.07.2007 7:02 masterdead | | dekompilaccia class v Assembler, C, C++, Pascal, Java | 1 | 665 | 05.11.2007 9:04 sento | | User Class v Redakčné systémy | 2 | 473 | 12.03.2007 14:51 koudy | | User Class - help v Redakčné systémy | 8 | 445 | 08.01.2007 19:09 Leachim | | class a id v HTML, XHTML, XML, CSS | 15 | 1387 | 18.07.2008 1:55 dedko45 | | class get/post v PHP, ASP | 0 | 510 | 06.06.2010 18:20 Unlink | | Verify Class ID v Operačné systémy Microsoft | 0 | 339 | 17.04.2009 0:34 lukas | | [VYRIESENE] template class v PHP, ASP | 16 | 1108 | 08.02.2009 18:54 Unlink | | [VYRIESENE] PHP unzip class v PHP, ASP | 6 | 541 | 26.02.2009 13:01 Flety | | Mysql database php class v PHP, ASP | 25 | 1308 | 28.02.2008 13:04 martin90 | | database class, oop php v PHP, ASP | 10 | 777 | 16.02.2010 15:12 rooobertek |
| Nemôžete zakladať nové témy v tomto fóre Nemôžete odpovedať na témy v tomto fóre Nemôžete upravovať svoje príspevky v tomto fóre Nemôžete mazať svoje príspevky v tomto fóre
|
|