Nastavenie rodicovskeho pointera na NULL – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Nastavenie rodicovskeho pointera na NULL – C / C++ – Fórum – Programujte.comNastavenie rodicovskeho pointera na NULL – C / C++ – Fórum – Programujte.com

 

bruenor0
Newbie
15. 3. 2009   #1
-
0
-

Dobry den,

chcel by som poprosit o radu. Robim jeden maly programik a narazil som na jeden problem. Urcite sa s tym uz niekto
z vas stretol...

V Borland c++ som si urobil jeden hlavny class form1. Okrem neho mam definovane dalsie 2 formy -> form2 a form3.
Z form1 volam form2 a form3 na stlacenie tlacitka.

class TForm1 : public TForm

{
...
public :
TForm2 *frm2;
TForm3 *frm3;
}

void TForm1::Button1Click(TObject *Sender)
{
if (frm2 == NULL)
{
frm2 = new TForm2(this);
}
frm2->Show();
}
void TForm1::Button2Click(TObject *Sender)
{
if (frm3 == NULL)
{
frm3 = new TForm3(this);
}

frm3->Show();
}



v evente onClose() nastavim form2 a form3 Action=caFree, teda sa samy uvolnia, problem vsak nastane s ukazovatelmi
v form1, nenastavia sa na NULL. Ako mozem poriesit to aby som ich nastavil na NULL? Do form2 a 3 mozem dat ukazovatel
na form1, a ked ukazovatele v form1 budu public mozem ich nastavit. Ale skor som potrebujem riesenie na tento typ:

void test()

{
int *i = new int;

*i = 10;

int *& j = i;
j = NULL;
}

alebo mozno

void func(int *& rpInt)
{
rpInt = NULL;
}
void __fastcall TForm1::Button2Click(TObject *Sender)
{
int *i = new int;

*i = 10;

func(i);

//i je teraz NULL
}




Chcem do form2 a do form3 dat referenciu na ukazovatel ktory ich zavolal a potom v formDestroy() ich nastavit na NULL.
Problem je ze mi to nejak nejde docielit s tym form1 :(
Vie niekto poradit?

Nahlásit jako SPAM
IP: 78.99.11.–
bruenor0
Newbie
15. 3. 2009   #2
-
0
-

To bruenor :

Hmm, ked som si urobil testovaciu funkciu :

void __fastcall TForm1::Button1Click(TObject *Sender)

{
if (frm == NULL)
{
frm = new TForm2(this);
}

frm->setReference(frm);
}


kde setReference je funkcia form2 a vyzera nasledovne :

void TForm2::setReference(TForm2 *& rpFrm)

{
rpFrm = NULL;
}


dosiahol som presne to co som chcel. Ukazovatel frm v form1 bol nastaveny na NULL. Ale problem je ze neviem ako mam urobit to, ze ked mi pride do setReference ukazovatel na referenciu rpFrm, neviem ako si ho mam uschovat mimo tejto funkcie aby som ten NULL mohol nastavit na onDestroy...Teda, do definicie triedy potrebujem definovat nejaky, ukazovatel, referenciu.., na ten rpFrm...aby som ten NULL mohol nastavit pri destroy form2..

Nevie niekto prosim ako sa to zapisuje?

Nahlásit jako SPAM
IP: 78.99.11.–
Quiark0
Věrný člen
15. 3. 2009   #3
-
0
-

Tak úplně to nechápu, ale jde ti o to, že máš funkci beroucí referenci na pointer a tu referenci si chceš uložit? Tak to nejde, protože reference se nedají kopírovat, ty jde nastavit jen jednou, při vytvoření. Nezbývá než referenci převést na pointer. Takže budeš mít pointer na pointer.

Nahlásit jako SPAM
IP: 89.102.6.–
bruenor0
Newbie
15. 3. 2009   #4
-
0
-

To Quiark : Potrebujem dosiahnut to, ze ked si v form1 zalozim dynamicku premennu(form2), ktora ma svoj ukazovatel...poslem ten ukazovatel, alebo referenciu do form2 a ked uz form2 nepotrebujem, tak v jej evente onDestroy nastavim
ten ukazovatel na NULL, aby som neskor v form1 mohol urobit :

if (ukazovatel == NULL)
(
vytvor znova form2
)

pretoze ked znicim form2, automaticky sa ukazovatekl nenastavy na null a ja potom neviem testnut ci mam form2 znova urobit alebo nie..

Nahlásit jako SPAM
IP: 78.99.11.–
Quiark0
Věrný člen
15. 3. 2009   #5
-
0
-

Tak já zkusím napsat nějaký kód



class Form2 {
Form2 **pointerToMyself// ukazatel na ukazatel na sebe.. abysme ho mohli vyNULLovat

void setPointerToMyself(Form2 **ptr) {
pointerToMyself = ptr;
}

void OnDestroy() {
// tady se nastavi form2 ve Form1 na NULL (protoze pointerToMyself tam ukazuje)
*pointerToMyself = NULL;
}

}

class Form1 {
Form2 *form2;

void onbuttonclick() {
if (form2== NULL) {
form2 = new Form2();
// rekneme Formu2, ktery ukazatel ma nastavit na NULL pri smazani
form2->setPointerToMyself(&form2);
}
}
}

Nahlásit jako SPAM
IP: 89.102.6.–
bruenor0
Newbie
15. 3. 2009   #6
-
0
-

To Quiark : Dakujem funguje to kraasne;)

Nahlásit jako SPAM
IP: 78.99.11.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 13 hostů

Podobná vlákna

Nastavenie VC++ — založil Trebor

Nastavenie Qt — založil Anonymní uživatel

Nastavenie Apache — založil mORb

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý