Re[3]: __try __finnaly и классы
От: Centaur Россия  
Дата: 23.03.06 15:46
Оценка: 1 (1) +1
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Bell, Вы писали:


B>>Здравствуйте, Аноним, Вы писали:

B>>Того же результата можно добиться стандартными средствами C++:

B>>
B>>int main()
B>>{
B>>   std::auto_ptr<MyClass> cl(new MyClass());
B>>   if(cl->IsError())
B>>      return 1;
B>>   else
B>>      return 0;
B>>}
B>>

А>Не так мне не подойдет, на самом деле у меня слудующая ситуация, мне этот объект будет нужен, если он нормально инитиализируется, а если нет то его нужно прибить...

Если объект не смог проинициализироваться, он должен прибрать за собой и выбросить исключение из конструктора.
__try __finnaly и классы
От: Аноним  
Дата: 23.03.06 09:39
Оценка:
Делаю так:
#include <windows.h>

class MyClass
{
public:
    MyClass() {}
    bool IsError() {return TRUE;}    
};

int main()
{
    MyClass *cl = new MyClass();
    __try
    {
        if(cl->IsError())
            __leave;
    }
    __finally
    {
        delete cl;
    }
}

Ругается: main.cpp(22): error C2712: Cannot use __try in functions that require object unwinding Что можно сделать?
Re: __try __finnaly и классы
От: Аноним  
Дата: 23.03.06 09:42
Оценка:
Вообще-то это не С++
Re[2]: __try __finnaly и классы
От: Аноним  
Дата: 23.03.06 09:49
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Вообще-то это не С++

А кто же?
Re[3]: __try __finnaly и классы
От: Аноним  
Дата: 23.03.06 09:57
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Аноним, Вы писали:


А>>Вообще-то это не С++

А>А кто же?

Ну это мелкософтовский диалект C++
Сам MS пишет про это следующее:

Possible solutions

Move code that requires SEH to another function.
Rewrite functions that use SEH to avoid the use of local variables and parameters that have destructors. Do not use SEH in constructors or destructors.
Compile using /GX-.


В общем не нравится ему то, что в этой функции объекты с деструкторами...
Re[3]: __try __finnaly и классы
От: rg45 СССР  
Дата: 23.03.06 09:59
Оценка:
"Аноним" <0@users.rsdn.ru> wrote in message news:1800043@news.rsdn.ru...
> Здравствуйте, Аноним, Вы писали:
>
> А>Вообще-то это не С++
> А кто же?

Цитата из MSDN:

The try-except and try-finally statements are a Microsoft extension to the C language that enables applications to gain control of a program after events that would normally terminate execution.

Posted via RSDN NNTP Server 2.0
--
Справедливость выше закона. А человечность выше справедливости.
Re: __try __finnaly и классы
От: Bell Россия  
Дата: 23.03.06 10:02
Оценка:
Здравствуйте, Аноним, Вы писали:
Того же результата можно добиться стандартными средствами C++:

int main()
{
   std::auto_ptr<MyClass> cl(new MyClass());
   if(cl->IsError())
      return 1;
   else
      return 0;
}
Любите книгу — источник знаний (с) М.Горький
Re: __try __finnaly и классы
От: Константин Ленин  
Дата: 23.03.06 12:17
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Делаю так:

А>
А>#include <windows.h>

А>class MyClass
А>{
А>public:
А>    MyClass() {}
А>    bool IsError() {return TRUE;}    
А>};

А>int main()
А>{
А>    MyClass *cl = new MyClass();
А>    __try
А>    {
А>        if(cl->IsError())
А>            __leave;
А>    }
А>    __finally
А>    {
А>        delete cl;
А>    }
А>}
А>

А>Ругается: main.cpp(22): error C2712: Cannot use __try in functions that require object unwinding Что можно сделать?

может лучше _set_se_translator?
Re[2]: __try __finnaly и классы
От: Аноним  
Дата: 23.03.06 12:28
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, Аноним, Вы писали:

B>Того же результата можно добиться стандартными средствами C++:

B>
B>int main()
B>{
B>   std::auto_ptr<MyClass> cl(new MyClass());
B>   if(cl->IsError())
B>      return 1;
B>   else
B>      return 0;
B>}
B>

Не так мне не подойдет, на самом деле у меня слудующая ситуация, мне этот объект будет нужен, если он нормально инитиализируется, а если нет то его нужно прибить...
MyClass *g_cl = NULL;

void foo()
{
    BOOL bOK = FALSE;
    g_cl = new MyClass();
    __try
    {
        if(g_cl->IsError())
            __leave;
            ...
            ...
        bOK = TRUE;
    }
    __finally
    {
        if(!bOK)
        {
            delete cl;
        }
    }
}

PS. Не нашел где ставить Gz-.
Re[2]: __try __finnaly и классы
От: Аноним  
Дата: 23.03.06 14:50
Оценка:
А где GX- поставить? И бутет ли потом SEH работать?
Re: __try __finnaly и классы
От: Left2 Украина  
Дата: 23.03.06 15:14
Оценка:
Что-то у меня складывается смутное подозрение что __try использован вместо try только потому что у него есть __finally. Если это так, то "скверной дорогой идёте, товарищи" — всё гораздо приличнее разруливается на std::auto_ptr и ему подобных смартпоинтерах.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: __try __finnaly и классы
От: Аноним  
Дата: 23.03.06 15:30
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Bell, Вы писали:


B>>Здравствуйте, Аноним, Вы писали:

B>>Того же результата можно добиться стандартными средствами C++:

B>>
B>>int main()
B>>{
B>>   std::auto_ptr<MyClass> cl(new MyClass());
B>>   if(cl->IsError())
B>>      return 1;
B>>   else
B>>      return 0;
B>>}
B>>

А>Не так мне не подойдет, на самом деле у меня слудующая ситуация, мне этот объект будет нужен, если он нормально инитиализируется, а если нет то его нужно прибить...
А>
А>MyClass *g_cl = NULL;

А>void foo()
А>{
А>    BOOL bOK = FALSE;
А>    g_cl = new MyClass();
А>    __try
А>    {
А>        if(g_cl->IsError())
А>            __leave;
А>            ...
А>            ...
А>        bOK = TRUE;
А>    }
А>    __finally
А>    {
А>        if(!bOK)
А>        {
А>            delete cl;
А>        }
А>    }
А>}
А>


[/ccode]
std::auto_ptr<MyClass> g_cl;

void foo()
{
std::auto_ptr cl(new MyClass());
if(cl->IsError())
return;
...
...
g_cl = cl;

}

int main()
{
foo();
...
...
g_cl.reset(); // думаю, не стоит ему жить дольше main()
}

[/ccode]
Re[4]: __try __finnaly и классы
От: Аноним  
Дата: 23.03.06 15:32
Оценка:
конечно же, с форматированием

std::auto_ptr<MyClass> g_cl;

void foo()
{
std::auto_ptr cl(new MyClass());
if(cl->IsError())
return;
...
...
g_cl = cl;

}

int main()
{
foo();
...
...
g_cl.reset(); // думаю, не стоит ему жить дольше main()
}
Re[3]: __try __finnaly и классы
От: decaf  
Дата: 23.03.06 18:20
Оценка:
А>
А>MyClass *g_cl = NULL;

А>void foo()
А>{
А>    BOOL bOK = FALSE;
А>    g_cl = new MyClass();
А>    __try
А>    {
А>        if(g_cl->IsError())
А>            __leave;
А>            ...
А>            ...
А>        bOK = TRUE;
А>    }
А>    __finally
А>    {
А>        if(!bOK)
А>        {
А>            delete cl;
А>        }
А>    }
А>}
А>





class MyClass
{
public:
  bool is_error;
  MyClass()
   : is_error(false)
  {
    try
    {
      init();
    }
    catch(...)
    {
      is_error = true;
      uinit();
    }
  }
}

void main()
{
  MyClass* mc = new MyClass;
  if(mc->is_error)
    delete mc;
}
Re[3]: __try __finnaly и классы
От: Alex_Avr Россия  
Дата: 24.03.06 05:38
Оценка:
А>Не так мне не подойдет, на самом деле у меня слудующая ситуация, мне этот объект будет нужен, если он нормально инитиализируется, а если нет то его нужно прибить...

Может быть, будет полезно — посмотри здесь
С уважением, Александр Авраменко.
Re[4]: __try __finnaly и классы
От: Аноним  
Дата: 24.03.06 13:33
Оценка:
Здравствуйте, Alex_Avr, Вы писали:

А>>Не так мне не подойдет, на самом деле у меня слудующая ситуация, мне этот объект будет нужен, если он нормально инитиализируется, а если нет то его нужно прибить...


A_A>Может быть, будет полезно — посмотри здесь

Что-то ссылка не работает...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.