The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"type_info"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"type_info"  
Сообщение от jelnw email on 08-Мрт-06, 23:55 
Хочу во время выполнения идентифицировать класс, из которого
брошено исключение. Для этого хочу в параметре конструктора
исключения передавать this, а в самом классе исключения через
RTTI узнать имя класса. this имеет тип type_info, а он закрыт.
Так каким же типом в конструкторе можно объявить указатель на
класс, или как можно корректно преобразовать?
Подскажите кто знает, pls...
Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

 Оглавление

  • type_info, jd, 07:12 , 09-Мрт-06, (1)  
    • type_info, jelnw, 03:43 , 10-Мрт-06, (2)  
      • type_info, DeadMustdie, 10:26 , 10-Мрт-06, (3)  

Сообщения по теме [Сортировка по времени, UBB]


1. "type_info"  
Сообщение от jd (??) on 09-Мрт-06, 07:12 
Не вполне понял насчёт "this имеет тип type_info, а он закрыт".
Если исключение у вас вызывается в методе класса, который вы хотите идентифицировать, то зачем для этого RTTI, ведь класс и так известен (да ещё и конкретная причина, вызвавшая исключение)? Если же исключение вызывается в связи с использованием указателя/ссылки на объект, тип которого нужно идентифицировать, то можно передать в конструктор исключения ссылку на type_id для этого объекта или сразу имя класса (typeid(*ptr).name(), где ptr - указатель на объект, тип которого нужно узнать). Следует обратить внимание, также, на то, что для корректной работы typeid класс должен быть полиморфным (то есть иметь виртуальные методы).
Если я что-то не так понял, приведите кусок кода с пояснениями, а то трудно понять, в чём проблема.
Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

2. "type_info"  
Сообщение от jelnw email on 10-Мрт-06, 03:43 
Действительно, как-то сумбурно написал.
Попробую по порядку.
В своей программе хочу записывать в лог сообщения об ошибках
и имя класса того объекта, в котором выброшено исключение.
Примерно так:

int main (int argc, char *argv[]) {
    ...
    try {
        SomeClass sc(-1);
    }
    catch (MyException &e) {
        log << e.who() << " -> " << e.what();
        throw;
    }
    ...
}

Использовать класс MyException хочу так:

class SomeClass {

    int _sm;

    public:

    SomeClass (int sm) {
        if (sm >= 0) _sm = sm;
        else throw MyException(*this, "sm must be positive");
    }
    
    ...
};


Класс MyException, предназначенный для обработки специфичных
для моей программы ошибок, примерно таков:

class MyException {
    
    ? _obj;
    string _msg;

    public:

    MyException (? obj, string msg): _obj(obj), _msg(msg) {}
    
    string who () {
        string s(typeid(_obj).name());
        return s;
    }

    string what () {
        return _msg;
    }    

};

Там, где знак вопроса и непонятно.
А по поводу закрытости имел в виду (недоимел :-) конструктор type_info.

Непосредственно имена классов передавать пробовал, но возникает
какое-то ощущение недоделанности.

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

3. "type_info"  
Сообщение от DeadMustdie email(??) on 10-Мрт-06, 10:26 
#include <stdio.h>
#include <string>
#include <typeinfo>

class SuperError
{
private:
  const char* who_;
  std::string what_;

public:
  SuperError(const char* _who, const std::string& _what)
    : who_(_who ? _who : "<null>"), what_(_what)
  {}
  
  const char* who() const throw() { return who_; }
  const char* what() const throw() { return what_.c_str(); }
};

template<typename C>
void raiseError(const C& c, const std::string& msg)
{
  throw SuperError(typeid(c).name(), msg);
}


class MyClass
{
public:
  MyClass()
  {
    raiseError(*this, "some ugly message");
  }
};


int main()
{
  try {
    MyClass myClass;
  } catch(const SuperError& err) {
    printf("'%s' -> '%s'\n", err.who(), err.what());
  }
  return 0;
}

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Спонсоры:
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2022 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру