Vícenásobné zanoření – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Vícenásobné zanoření – C / C++ – Fórum – Programujte.comVícenásobné zanoření – C / C++ – Fórum – Programujte.com

 

Spuštěný nový filmový web Filmožrouti.cz — vše o Avengers, Pacific Rim, Thor, Star Wars…
Bobek
~ Anonymní uživatel
14 příspěvků
17. 11. 2017   #1
-
0
-

Ahoj, 

potřeboval bych zodpovědět několik dotazů:

-- je to programátorsky správně takto vytvořený kód? Nebo je to principiálně dobře, ale používat by se to nemělo?

-- je správně napsaný kopírovací konstruktor a operátor přiřazení?

-- jak by mělo probíhat dealokování objektů, až se bude vracet zpět ze zanoření?

o co sem se snažil.

- active state

- return state - actvice state

                     - return state - active state

                                          - return state - atd.

namespace ui
{

enum State
{
    Menu1 = 0,
    Menu2 = 1,
    Menu3 = 2
};

}


struct State
{
    State()
        : activeState(ui::NoState)
        , returnState(0)
    {}

    State(ui::State state)
        : activeState(state)
        , returnState(0)
    {}

    State(ui::State state, ui::State returnState)
        : activeState(state)
        , returnState(new State(returnState))
    {}

    State(ui::State state, State returnState)
        : activeState(state)
        , returnState(new State(returnState))
    {}

    State(const State &state)
        : activeState(state.activeState)
        , returnState(new State)
    {
        returnState = state.returnState;
    }

    State &operator=(const State &other)
    {
        if (this != &other)
        {
            delete returnState;

            returnState = new State;
            returnState = other.returnState;
            activeState = other.activeState;
        }

        return *this;
    }

    ui::State activeState;
    State *returnState;
};

Nahlásit jako SPAM
IP: 213.250.231.–
KIIV
~ Moderátor
+42
God of flame
17. 11. 2017   #2
-
0
-

#1 Bobek
uz od oka je to blbe, jelikoz nedodrzujes takzvane "rule of three" respektive "rule of five" - pokud ma objekt netrivialni konstruktor (ovbykle je tim mysleno "neco alokuje"), tak by mel mit taktez destruktor, copy constructor, copy assigment operator (to je to pravidlo tri) a pravidlo peti pak jeste pridava move constructor a move assigment operator.

Jedine co implementujes je ten copy constructor a copy assigment operator (oba blbe). Udelas new a pak ten pointer prepises pointerem z other.returnState misto abys zkopiroval jeho hodnotu na misto, ktere sis udelal pomoci new.

Destruktor si uplne vynechal a bude ti tam unikat pamet (jeste krom toho predchoziho zmineneho)

Nahlásit jako SPAM
IP: 91.127.94.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Bobek
~ Anonymní uživatel
14 příspěvků
17. 11. 2017   #3
-
0
-

#2 KIIV

takže opravené řešení je následující. Tohle už by mělo odpovídat "rule of three".

    ~State()
    {
        delete returnState;
    }

    State(const State &state)
        : activeState(state.activeState)
        , returnState(new State)
    {
        returnState->activeState = state.returnState->activeState;
        *returnState->returnState = *state.returnState->returnState;
    }

    State &operator=(const State &other)
    {
        if (this != &other)
        {
            delete returnState;

            activeState = other.activeState;

            returnState = new State;
            returnState->activeState = other.returnState->activeState;
            *returnState->returnState = *other.returnState->returnState;
        }

        return *this;
    }
Nahlásit jako SPAM
IP: 213.250.231.–
KIIV
~ Moderátor
+42
God of flame
17. 11. 2017   #4
-
0
-

#3 Bobek
no nejsem si jist co to presne ma delat, ale nebylo by od veci kontrolovat jestli returnState neni NULL + vyuzit ten copy assigment operator: *returnState = *(other.returnState);

U  *returnState->returnState = *other.returnState->returnState;  vlastne delas jen melkou kopii. Ale bez kontroly NULL se to pravdepodobne utopi v nekonecne rekurzi. Plus si nejsem uplne jist prioritama, jestli se pak dereferencuje to co ma (radeji dat extra zavorky nez to mit komplet blbe).
 

Nahlásit jako SPAM
IP: 91.127.94.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Bobek
~ Anonymní uživatel
14 příspěvků
17. 11. 2017   #5
-
0
-

#4 KIIV
Ještě než si to napsal sem tam dodělal kontroly ... a doplnil to co píšeš. Podle debuggování se to chová korektně. Tak uvidíme. Děkuji za rady.

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

Přidej příspěvek

×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, 74 hostů

Podobná vlákna

Vícenásobné větvení — založil wh

Vicenasobne nacteni sablony — založil Jakub Stach

Moderátoři diskuze

 

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