[ Príspevkov: 17 ] 
AutorSpráva
Offline

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

Registrovaný: 19.09.06
Prihlásený: 19.02.26
Príspevky: 749
Témy: 31 | 31
Bydlisko: Ružomberok&...
NapísalOffline : 11.11.2010 15:35 | C++ class

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ý: 01.05.26
Príspevky: 1399
Témy: 10 | 10
Bydlisko: Hrinova
NapísalOffline : 11.11.2010 18:04 | C++ class

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ý: 19.02.26
Príspevky: 749
Témy: 31 | 31
Bydlisko: Ružomberok&...
Napísal autor témyOffline : 11.11.2010 18:07 | C++ class

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ý: 01.05.26
Príspevky: 1399
Témy: 10 | 10
Bydlisko: Hrinova
NapísalOffline : 12.11.2010 10:26 | C++ class

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ý: 19.02.26
Príspevky: 749
Témy: 31 | 31
Bydlisko: Ružomberok&...
Napísal autor témyOffline : 12.11.2010 12:15 | C++ class

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 | 2
NapísalOffline : 12.11.2010 12:31 | C++ class

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ý: 19.02.26
Príspevky: 749
Témy: 31 | 31
Bydlisko: Ružomberok&...
Napísal autor témyOffline : 12.11.2010 12:47 | C++ class

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 | 2
NapísalOffline : 12.11.2010 13:42 | C++ class

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 | 22
Bydlisko: Zilinska Un...
NapísalOffline : 12.11.2010 19:27 | C++ class

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ý: 19.02.26
Príspevky: 749
Témy: 31 | 31
Bydlisko: Ružomberok&...
Napísal autor témyOffline : 12.11.2010 19:41 | C++ class

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ý: 27.04.26
Príspevky: 14328
Témy: 319 | 319
Bydlisko: Bratislava
NapísalOffline : 12.11.2010 22:24 | C++ class

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ý: 19.02.26
Príspevky: 749
Témy: 31 | 31
Bydlisko: Ružomberok&...
Napísal autor témyOffline : 12.11.2010 22:25 | C++ class

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 | 13
NapísalOffline : 13.11.2010 3:39 | C++ class

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 | 22
Bydlisko: Zilinska Un...
NapísalOffline : 13.11.2010 11:37 | C++ class

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 | 13
NapísalOffline : 13.11.2010 11:51 | C++ class

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 | 22
Bydlisko: Zilinska Un...
NapísalOffline : 13.11.2010 12:10 | C++ class

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 | 13
NapísalOffline : 13.11.2010 12:32 | C++ class

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.
 [ Príspevkov: 17 ] 


C++ class



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 Backend

0

321

19.11.2011 14:29

Loko11

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

762

16.12.2010 20:09

majky358

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

Mám sa učiť C ++/objective C/ C#?

v Backend

5

849

08.07.2014 20:40

XOLOO

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

User Class

v CMS

3

571

06.07.2007 7:02

masterdead

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

dekompilaccia class

v Backend

1

731

05.11.2007 9:04

sento

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

User Class

v CMS

2

552

12.03.2007 14:51

koudy

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

Delphi class

v Ostatné

1

901

10.09.2009 16:35

Fico

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

class PHPMailer

v Backend

3

401

30.09.2012 12:19

shaggy

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

class a id

v Frontend

15

1512

18.07.2008 1:55

dedko45

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

class get/post

v Backend

0

641

06.06.2010 18:20

Unlink

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

Verify Class ID

v Windows

0

411

17.04.2009 0:34

lukas

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

[VYRIESENE] template class

v Backend

16

1223

08.02.2009 18:54

Unlink

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

User Class - help

v CMS

8

511

08.01.2007 19:09

Leachim

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

Metody a class extend

v Backend

3

558

22.03.2010 21:06

emer

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

[VYRIESENE] PHP template class

v Backend

23

1217

24.02.2009 23:09

Flety

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

PHP OOP MYSQLi Class

v Backend

6

736

08.04.2012 15:42

lolexc



© 2005 - 2026 PCforum, edited by JanoF