Obsah fóra
PravidláRegistrovaťPrihlásenie




Odpovedať na tému [ Príspevkov: 17 ] 
AutorSpráva
Offline

Užívateľ
Užívateľ
C++ class

Registrovaný: 19.09.06
Prihlásený: 17.01.24
Príspevky: 749
Témy: 31
Bydlisko: Ružomberok&...
Príspevok NapísalOffline : 11.11.2010 15:35

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?


Offline

Skúsený užívateľ
Skúsený užívateľ
C++ class

Registrovaný: 11.01.09
Prihlásený: 28.03.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 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.


Offline

Užívateľ
Užívateľ
C++ class

Registrovaný: 19.09.06
Prihlásený: 17.01.24
Príspevky: 749
Témy: 31
Bydlisko: Ružomberok&...
Príspevok Napísal autor témyOffline : 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.


Offline

Skúsený užívateľ
Skúsený užívateľ
C++ class

Registrovaný: 11.01.09
Prihlásený: 28.03.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 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.


Offline

Užívateľ
Užívateľ
C++ class

Registrovaný: 19.09.06
Prihlásený: 17.01.24
Príspevky: 749
Témy: 31
Bydlisko: Ružomberok&...
Príspevok Napísal autor témyOffline : 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.


Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 29.10.08
Prihlásený: 30.07.12
Príspevky: 933
Témy: 2
Príspevok NapísalOffline : 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

Offline

Užívateľ
Užívateľ
C++ class

Registrovaný: 19.09.06
Prihlásený: 17.01.24
Príspevky: 749
Témy: 31
Bydlisko: Ružomberok&...
Príspevok Napísal autor témyOffline : 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;
}


Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 29.10.08
Prihlásený: 30.07.12
Príspevky: 933
Témy: 2
Príspevok NapísalOffline : 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;
        }
    };
};


Offline

Užívateľ
Užívateľ
C++ class

Registrovaný: 02.11.07
Prihlásený: 18.03.15
Príspevky: 470
Témy: 22
Bydlisko: Zilinska Un...
Príspevok NapísalOffline : 12.11.2010 19:27

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
Offline

Užívateľ
Užívateľ
C++ class

Registrovaný: 19.09.06
Prihlásený: 17.01.24
Príspevky: 749
Témy: 31
Bydlisko: Ružomberok&...
Príspevok Napísal autor témyOffline : 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.


Offline

Skúsený užívateľ
Skúsený užívateľ
C++ class

Registrovaný: 02.07.06
Prihlásený: 28.03.24
Príspevky: 14180
Témy: 312
Bydlisko: Bratislava
Príspevok NapísalOffline : 12.11.2010 22:24

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!
Offline

Užívateľ
Užívateľ
C++ class

Registrovaný: 19.09.06
Prihlásený: 17.01.24
Príspevky: 749
Témy: 31
Bydlisko: Ružomberok&...
Príspevok Napísal autor témyOffline : 12.11.2010 22:25

hore v tom linku mas opisany popis na co by sa to dalo vyuzit


Offline

Užívateľ
Užívateľ
C++ class

Registrovaný: 16.02.08
Prihlásený: 08.12.10
Príspevky: 235
Témy: 13
Príspevok NapísalOffline : 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.
Offline

Užívateľ
Užívateľ
C++ class

Registrovaný: 02.11.07
Prihlásený: 18.03.15
Príspevky: 470
Témy: 22
Bydlisko: Zilinska Un...
Príspevok NapísalOffline : 13.11.2010 11:37

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
Offline

Užívateľ
Užívateľ
C++ class

Registrovaný: 16.02.08
Prihlásený: 08.12.10
Príspevky: 235
Témy: 13
Príspevok NapísalOffline : 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.
Offline

Užívateľ
Užívateľ
C++ class

Registrovaný: 02.11.07
Prihlásený: 18.03.15
Príspevky: 470
Témy: 22
Bydlisko: Zilinska Un...
Príspevok NapísalOffline : 13.11.2010 12:10

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
Offline

Užívateľ
Užívateľ
C++ class

Registrovaný: 16.02.08
Prihlásený: 08.12.10
Príspevky: 235
Témy: 13
Príspevok NapísalOffline : 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.
Odpovedať na tému [ Príspevkov: 17 ] 


Podobné témy

 Témy  Odpovede  Zobrazenia  Posledný príspevok 
V tomto fóre nie sú ďalšie neprečítané témy. Visual C++ 2008 použitie classu z class library

v Assembler, C, C++, Pascal, Java

0

244

19.11.2011 14:29

Loko11 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. MicroSDHC class 2 alebo class 4 mám vrátiť ?

v Pamäte

3

664

16.12.2010 20:09

majky358 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Mám sa učiť C ++/objective C/ C#?

v Assembler, C, C++, Pascal, Java

5

724

08.07.2014 20:40

XOLOO Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. class PHPMailer

v PHP, ASP

3

313

30.09.2012 12:19

shaggy Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Delphi class

v Delphi, Visual Basic

1

783

10.09.2009 16:35

Fico Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. User Class

v Redakčné systémy

3

505

06.07.2007 7:02

masterdead Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. dekompilaccia class

v Assembler, C, C++, Pascal, Java

1

665

05.11.2007 9:04

sento Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. User Class

v Redakčné systémy

2

473

12.03.2007 14:51

koudy Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. User Class - help

v Redakčné systémy

8

445

08.01.2007 19:09

Leachim Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. class a id

v HTML, XHTML, XML, CSS

15

1387

18.07.2008 1:55

dedko45 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. class get/post

v PHP, ASP

0

510

06.06.2010 18:20

Unlink Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Verify Class ID

v Operačné systémy Microsoft

0

339

17.04.2009 0:34

lukas Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. [VYRIESENE] template class

v PHP, ASP

16

1108

08.02.2009 18:54

Unlink Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. [VYRIESENE] PHP unzip class

v PHP, ASP

6

541

26.02.2009 13:01

Flety Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Mysql database php class

v PHP, ASP

25

1308

28.02.2008 13:04

martin90 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. database class, oop php

v PHP, ASP

10

777

16.02.2010 15:12

rooobertek Zobrazenie posledných príspevkov


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

Skočiť na:  

Powered by phpBB Jarvis © 2005 - 2024 PCforum, webhosting by WebSupport, secured by GeoTrust, edited by JanoF
Ako väčšina webových stránok aj my používame cookies. Zotrvaním na webovej stránke súhlasíte, že ich môžeme používať.
Všeobecné podmienky, spracovanie osobných údajov a pravidlá fóra