调试构造函数初始化列表

时间:2014-01-20 22:15:53

标签: c++

class A{
public:
     A(): b(), c(), d(){}
private:
B b;
C c;
D d;
};

我有类似上面的代码。初始化列表比这里长的地方。在某些地方,对象的初始化出错了。我想找出它出错的地方;在什么对象之后以及在哪个对象的初始化中它失败了。

我不想将打印语句添加到相应的类中。

我想过有一种方法可以在构造函数中为我打印一行;这样我需要拥有与类A中的类变量数一样多的对象。没有段错误或抛出任何异常,我可以捕获。

除了让一个具有尽可能多的temp对象的类temp作为成员变量之外,还有其他方法可以调试这个。有没有聪明的方法来调试它。感谢。

1 个答案:

答案 0 :(得分: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;
};