Re: Опять про goto
От: Vova123  
Дата: 23.07.06 11:54
Оценка:
Здравствуйте, Rackshas, Вы писали:

R>goto-ненавистники, как вот такой код

R>
R>void HZ()
R>{
R>    if(!init1()) goto d1;
R>    if(!init2()) goto d2;
R>    if(!init3()) goto d3;

R>d3:
R>    destroy3();
R>d2:
R>    destroy2();
R>d1:
R>    destroy1();
R>}

R>


R>Избавить от goto?



void HZ()
{
    try
    {
        T1 t1;
        T2 t2;
        T3 t3;

        // smth else

    }
    catch (...)
    {
    }
}

class T1
{
    T1()
    {
        if(!Init1()) throw new MyException();
    }
    bool Init1()
    {
        return rnd() > rnd();
    }
};
Re[2]: Опять про goto
От: Pyromancer  
Дата: 23.07.06 13:31
Оценка:
Здравствуйте, Vova123, Вы писали:

Одним catch(...) тут не обойтись, потому что надо знать какой инит провалился
Re[3]: Опять про goto
От: Vova123  
Дата: 23.07.06 14:27
Оценка:
Здравствуйте, Pyromancer, Вы писали:

P>Одним catch(...) тут не обойтись, потому что надо знать какой инит провалился


Ах да! Совсем забыл!


class T1
{
    T1()
    {
        if(!Init1())
        {
             Destroy1();
             throw new MyException();             
        }
    }
    ~T1()
    {
        Destroy1();
    }
    bool Init1()
    {
        return rnd() > rnd();
    }
    void Destroy1()
    {
    }
};


Любой объект в конструкторе инициализирует что надо, в деструкторе — разрушает. Если я понял автора первого поста, то ему надо, чтобы:
  • Был выдержан порядок при инициализации.
  • Между инициализацией и разрушением выполнилось какой-то действие.
  • Разрушилось только то, что было создано.

    В буквальной же постановке задача смысла не имеет — goto действительно понятнее, чем все эти if'ы.
  • Re[4]: Опять про goto
    От: Vova123  
    Дата: 23.07.06 14:30
    Оценка: -1
    Здравствуйте, Vova123, Вы писали:

    Не могу вспомнить, а разбираться не хочу.

    Возможно, что объект вызывает свой деструктор, если в конструкторе выкинуть исключение. Надо Стандарт смотреть. Если так, то следует убрать вызов Destroy перед throw.
    Re[5]: Опять про goto
    От: Roman Odaisky Украина  
    Дата: 23.07.06 20:44
    Оценка:
    Здравствуйте, Vova123, Вы писали:

    V>Не могу вспомнить, а разбираться не хочу.


    V>Возможно, что объект вызывает свой деструктор, если в конструкторе выкинуть исключение. Надо Стандарт смотреть. Если так, то следует убрать вызов Destroy перед throw.


    Не вызывает. А если в конструкторе есть try/catch, то это плохой конструктор.
    До последнего не верил в пирамиду Лебедева.
    Re[6]: Опять про goto
    От: Vova123  
    Дата: 24.07.06 05:21
    Оценка:
    Здравствуйте, Roman Odaisky, Вы писали:

    RO>Не вызывает.


    Тогда можно оставить, как есть.
    Re[6]: Опять про goto
    От: fddima  
    Дата: 24.07.06 07:26
    Оценка:
    Здравствуйте, Roman Odaisky, Вы писали:

    RO>Не вызывает. А если в конструкторе есть try/catch, то это плохой конструктор.

    Это еще почему?
    Re: Опять про goto
    От: dmitry_npi Россия  
    Дата: 05.08.06 20:58
    Оценка:
    Здравствуйте, Rackshas, Вы писали:

    R>goto-ненавистники, как вот такой код

    R>
    R>void HZ()
    R>{
    R>    if(!init1()) goto d1;
    R>    if(!init2()) goto d2;
    R>    if(!init3()) goto d3;
    
    R>d3:
    R>    destroy3();
    R>d2:
    R>    destroy2();
    R>d1:
    R>    destroy1();
    R>}
    
    R>


    R>Избавить от goto?



    Я бы включил вызовы destroyX в тело функции initX. В конце концов, WinAPI функции, например, когда падают, ведь не требуют подчищать за ними.
    Атмосферная музыка — www.aventuel.net
    Re[2]: Опять про goto
    От: Erop Россия  
    Дата: 08.08.06 14:51
    Оценка:
    Здравствуйте, Vova123, Вы писали:

    R>>Избавить от goto?



    V>
    V>void HZ()
    V>{
    V>    try
    V>    {
    V>        T1 t1;
    V>        T2 t2;
    V>        T3 t3;
    
    V>        // smth else
    
    V>    }
    V>    catch (...)
    V>    {
    V>    }
    V>}
    
    V>class T1
    V>{
    V>    T1()
    V>    {
    V>        if(!Init1()) throw new MyException();
    V>    }
    V>    bool Init1()
    V>    {
    V>        return rnd() > rnd();
    V>    }
    V>};
    V>


    А это проще или быстрее?
    Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
    Re: Опять про goto
    От: Shmakov Россия  
    Дата: 15.08.06 19:17
    Оценка:
    void HZ()
    {
        
        int i = 0;    
        if ((init1() && ++i) && (init2() && ++i)  && (init3() && ++i))
    
        switch (i)
        {
            case 3: destroy3();
            case 2: destroy2();
            case 1: destroy1();
    
        }
    
    }
    Re[2]: Опять про goto
    От: Shmakov Россия  
    Дата: 15.08.06 19:22
    Оценка:
    В конце if забыл ;

    вот так помоему:

    void HZ()
    {
        
        int i = 0;    
        if ((init1() && ++i) && (init2() && ++i)  && (init3() && ++i));
    
        switch (i)
        {
            case 3: destroy3();
            case 2: destroy2();
            case 1: destroy1();
    
        }
    
    }
    Re[3]: Опять про goto
    От: Shmakov Россия  
    Дата: 15.08.06 19:24
    Оценка:
    Хотя скобки лишние...

    Да — вот так

    void HZ()
    {
        
        int i = 0;    
        if (init1() && ++i && init2() && ++i && init3() && ++i);
    
        switch (i)
        {
            case 3: destroy3();
            case 2: destroy2();
            case 1: destroy1();
    
        }
    
    }
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.