2014-01-20 6 views
0
class A{ 
public: 
    A(): b(), c(), d(){} 
private: 
B b; 
C c; 
D d; 
}; 

У меня есть нечто похожее на код выше. где список инициализации длиннее, чем здесь. Где-то в инициализации объектов происходят ошибки. Я хочу узнать, где это случилось? после какого объекта и при инициализации какого-либо объекта он терпит неудачу.Отладка Список инициализации конструктора

Я не хочу это делать, добавляя утверждения печати в соответствующие классы.

Один из способов подумать о том, что у меня есть класс temp, который напечатает строку для меня в своем конструкторе; Таким образом, мне нужно иметь столько же объектов, сколько количество переменных класса в моем классе A. Не существует segfault или любого исключаемого исключения, которое я могу поймать.

Так что я могу отладить это иначе, чем иметь temp tem с таким количеством объектов temp, как переменные-члены. Есть ли разумный способ отладить это. Благодарю.

+0

Вы пытались использовать отладчик? – FRob

+0

Является ли порядок списка инициализации таким же, как порядок, в котором объекты объявлены в определении класса? И для любого из конструкторов этих объектов требуется передать другой объект? – Praetorian

+0

Ну, моя программа работает на кластере, поэтому я не могу прикрепить отладчик, поскольку он встречается на одном из узлов. Да, порядок инициализации правильный, и ни один из объектов не передается другим классам, которые неинициализированы. Но в любом случае, если я хочу напечатать заявление после инициализации каждого объекта, есть ли простой способ сделать это, кроме того, о котором я упоминал. – rkb

ответ

0
#include <exception> 
#include <string> 
#include <typeinfo> 
#include <iostream> 

struct B 
{ 
}; 
struct C 
{ 
}; 
struct D 
{ 
}; 
struct YourExceptionType:std::exception 
{ std::string m_s; 
    YourExceptionType(const std::string &_r) 
     :m_s(_r) 
    { 
    } 
    ~YourExceptionType(void) throw() 
    { 
    } 
    const char *what(void) const throw() 
    { return m_s.c_str(); 
    } 
}; 
struct Show 
{ Show(const char *const _p) 
    { std::cout << _p << std::endl; 
    } 
}; 
template<typename A> 
struct ShowMe:Show, A 
{ ShowMe(void) 
     try:Show(typeid(A).name()), 
     A() 
    { 
    } catch (const std::exception &_r) 
    { throw YourExceptionType(
      (std::string("Failed constructor of type ") 
      + typeid(A).name() 
      + ":" + _r.what()).c_str()); 
    } 
}; 
class A{ 
    public: 
    A(): b(), c(), d(){} 
    private: 
    ShowMe<B> b; 
    ShowMe<C> c; 
    ShowMe<D> d; 
}; 
Смежные вопросы