.[ ČeskéHry.cz ].
ukzatel na třídu

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
am!go



Založen: 19. 08. 2007
Příspěvky: 61
Bydliště: Praha

PříspěvekZaslal: 7. září 2007, 14:47:01    Předmět: ukzatel na třídu Odpovědět s citátem

Čau, narazil jsem na problém, který dost zamíchal s mym chápáním ukazatelů. Vůbec netuším, proč to nefunguje. Jedná se o to, že v jedné třídě vytvořím dynamicky pole jiných tříd a pak se snažím o to, aby ukazatel z venčí ukazoval na jeden prvek toho pole. Ale tohle nefunguje.

kód:

#include "stdafx.h"
#include <windows.h>
#include <iostream>
using namespace std;

class childclass
{
   public:
      int number;
      void setNumber(int num);
};

class parentclass
{
   private:
      childclass *c;
   public:
      void setup();
      void getChildClass(int number, childclass *cclass);
      void clean();
};

void childclass::setNumber(int num)
{
   number = num;
}

void parentclass::setup()
{
   c = new childclass[10];
   for(int i=0; i<10; i++) c[i].number = i;
}
void parentclass::getChildClass(int number, childclass *cclass)
{
   cclass = (childclass*)c[number];
}

void parentclass::clean()
{
   delete[] c;
}

int _tmain(int argc, _TCHAR* argv[])
{
   parentclass parentc;
   parentc.setup();
   childclass *cc = 0;
   parentc.getChildClass(4, cc);
   if(cc!=0) cout << cc->number << "\n";
   system("pause");
   return 0;
}
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
igor



Založen: 28. 07. 2007
Příspěvky: 196

PříspěvekZaslal: 7. září 2007, 15:03:38    Předmět: Odpovědět s citátem

cclass = (childclass*)c[number];

no priznam se, ze ted momentalne 100% nevim, jak se tohle chova, ale nebylo by lepsi tomu cclass priradit adresu toho prvku? - prvek neni adresou, nazev pole ano

cclass=&c[number]; //popr. snad i cclass=c+number;

a taky bych to resil jako navratovou hodnotu te funkce nebo ten ukazatel posilal jako referenci, v te tve funkci tam posilas kopii ukazatele (adresu na kterou ukazuje ukazatel posilas hodnotou)

EDIT:
Tak jsem zkousel upravit tvuj kod podle toho, co jsem tu napsal - funguje to.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
am!go



Založen: 19. 08. 2007
Příspěvky: 61
Bydliště: Praha

PříspěvekZaslal: 7. září 2007, 15:20:13    Předmět: Odpovědět s citátem

Díky za odpověď. Takže zaprvý. V tom kódu nahoře mám chybu, takže se vůbec nezkompiluje. Ta funkce getChildClass má vypadat takhle
kód:

void parentclass::getChildClass(int number, childclass *cclass)
{
   cclass = &c[number];
}


Potom jsem si napsat ještě jednu funkci, která dělá to samý, akorát tu třídu vrací přes return a to funguje perfektně.
kód:

childclass* parentclass::getChildClass(int number)
{
   return &c[number];
}

Každopádně ale pořád nemám tušení, proč ta předešlá verzes ukazatelem nefungovala.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
igor



Založen: 28. 07. 2007
Příspěvky: 196

PříspěvekZaslal: 7. září 2007, 15:27:43    Předmět: Odpovědět s citátem

Uz jsem to tam psal, tak jeste jednou:

kdyz posles jako argument funkce napr. int x, tak v te funkci se pouziva nove vytvorena lokalni promenna int x s hodnotou zkopirovanou z integeru, ktery jsi predal pri volani funkce - pristup k puvodni promenne ziskas bud pres argument jako ukazatel *int nebo referenci &int.

to same s ukazatelem - v te funkci se vytvori novy ukazatel, ktery bude ukazovat na adresu, na kterou ukazoval ukazatel, ktery jsi funkci predal - k puvodnimu ukazateli ale nemas pristup... musis to vyresit bud vracenim hodnoty, ukazatelem na ukazatel nebo referenci na ukazatel
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
rezna



Založen: 27. 07. 2007
Příspěvky: 2156

PříspěvekZaslal: 7. září 2007, 15:37:53    Předmět: Odpovědět s citátem

nefungovala protoze to mas blbe - abys neco vratil musis na to dat ukazal - abys vratil ukazatel musis na neho dat ukazatel - to je ukazatel na ukazatel - tedy **

kód:
void parentclass::getChildClass(int number, childclass ** cclass)
{
   *cclass = &c[number];
}
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
am!go



Založen: 19. 08. 2007
Příspěvky: 61
Bydliště: Praha

PříspěvekZaslal: 7. září 2007, 15:38:44    Předmět: Odpovědět s citátem

Jasně musim použít ukazatel na ukazatel. Už je mi to jasný, díky.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++ Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna