Saját osztály, unique_ptr használata, .NET-hez hasonló a deklaráláshoz
2020-11-24T10:47:53+01:00
2020-11-24T11:36:13+01:00
2022-08-11T23:10:32+02:00
Zserigta
Sziasztok.
Szeretnék csinálni egy saját Formot C++ alatt, amit hasonló módon lehetne használni, mint .NET alatt.
A problémám ott kezdődik, hogy még az alábbi példában a Teszt 1 feliratú form szépen bezáródik és átveszi a helyét a Teszt 2 feliratú (ahogy az .NET alatt is történne), addig a TesztX a cikluson belül minden egyes létrehozásnál csak 1 pillanatra ugrik fel és be is záródik.
Holott ugyan ezen elven .NET alatt a ciklusban lévő N számú form mind megnyílik.

CustomControls::CustomForm Form1(L"Teszt 1"); Form1 = CustomControls::CustomForm(L"Teszt 2"); CustomControls::CustomForm Form2(L"Teszt 3"); for (int i = 0; i < 4; i++) { CustomControls::CustomForm FormX(L"TesztX"); }
Csatolva a Test2.h ami tartalmazza a CustomForm osztályomat.
Kérdés, hogy miként alakíthatnám úgy át, hogy a .NET-hez hasonlóan működjön, tehát mint az előbbi példában a Form1-et felülírva az ezen a változón lévő Form bezáródjon és az új jöjjön létre, de a cikluson belül ne törölje az előzőt, hanem annyiszor jöjjön létre, ahányszor a ciklusban létrehozódik a változó.

Környezet: VS2015, C++, Native, Win32

Mivel ebbe sokan bele szoktak kötni, leírom, hogy nem munka, nem feladat, hanem inkább önképzés és kihívás miatt programozgatok native Win32-ben.
Mutasd a teljes hozzászólást!
Csatolt állomány
for (int i = 0; i < 4; i++) { new CustomControls::CustomForm(L"TesztX"); }
Írhatsz ilyet, de akkor nem lesz, aki felszabadítsa. Illetve körülményes megoldani a felszabadítást.
Teheted a new ereményét smart pointerbe, amit lokálisan deklarálsz, de a lokális smart pointer példány megszűnik a ciklus végén, tehát a uniqe_ptr itt nem segít. Marad a shared_ptr, de ahhoz kell egy külön deklarált másik shared_ptr (vektor!), szóval ha jól sejtem, ez neked szintén nem lesz jó.

Amúgy nem értem, miért szükséges ez a lokális deklaráció megszorítás.
Mutasd a teljes hozzászólást!

  • A FormX élete a ciklus végén befejeződik, tehát lefut a destruktor és törlődik a példányod. Ez az elvárt viselkedés. Ha azt akarod, hogy FormX minden értéke túlélje a ciklus lefutását, ne a ciklusban lokális automatikus változóba tedd, hanem olyanba, ami a cikluson kívül is megmarad!
    Mutasd a teljes hozzászólást!
  • Pont erre irányulna a kérdésem, hogy cikluson belül, ezt miként lehetne megoldani, hogy az élete tovább folytatódjon (úgy mint pl VB.NET alatt).
    Mindenképp cél lenne, hogy a cikluson belül deklaráljam és hozzam létre, már amennyiben ez kivitelezhető.
    Mutasd a teljes hozzászólást!
  • for (int i = 0; i < 4; i++) { new CustomControls::CustomForm(L"TesztX"); }
    Írhatsz ilyet, de akkor nem lesz, aki felszabadítsa. Illetve körülményes megoldani a felszabadítást.
    Teheted a new ereményét smart pointerbe, amit lokálisan deklarálsz, de a lokális smart pointer példány megszűnik a ciklus végén, tehát a uniqe_ptr itt nem segít. Marad a shared_ptr, de ahhoz kell egy külön deklarált másik shared_ptr (vektor!), szóval ha jól sejtem, ez neked szintén nem lesz jó.

    Amúgy nem értem, miért szükséges ez a lokális deklaráció megszorítás.
    Mutasd a teljes hozzászólást!
  • Ezt kerestem, köszönöm.
    És hatalmas facepalm magamnak, hogy ez valamiért nem jutott eszembe.

    Jelen példában semmi értelme valóban, de nem is az értelme volt itt a cél, hanem a miként lehet megoldni dolog.

    Köszönöm még1x.
    Mutasd a teljes hozzászólást!
abcd