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
|
Zaslal: 7. září 2007, 14:47:01 Předmět: ukzatel na třídu |
|
|
Č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 |
|
 |
igor

Založen: 28. 07. 2007 Příspěvky: 196
|
Zaslal: 7. září 2007, 15:03:38 Předmět: |
|
|
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 |
|
 |
am!go

Založen: 19. 08. 2007 Příspěvky: 61 Bydliště: Praha
|
Zaslal: 7. září 2007, 15:20:13 Předmět: |
|
|
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 |
|
 |
igor

Založen: 28. 07. 2007 Příspěvky: 196
|
Zaslal: 7. září 2007, 15:27:43 Předmět: |
|
|
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 |
|
 |
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 7. září 2007, 15:37:53 Předmět: |
|
|
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 |
|
 |
am!go

Založen: 19. 08. 2007 Příspěvky: 61 Bydliště: Praha
|
Zaslal: 7. září 2007, 15:38:44 Předmět: |
|
|
Jasně musim použít ukazatel na ukazatel. Už je mi to jasný, díky. |
|
Návrat nahoru |
|
 |
|