我如何申报成员类?

时间:2015-07-02 14:53:45

标签: c++ header

我需要使用一个自定义异常类,它可以在成员中使用顶级类的功能。因此,将自定义类作为成员类是合理的。这是他们目前宣布的文件:

conductor.h

class conductor
{
    //some staff
private:
    class bad_index : public std::exception
    {
    public:
        bad_index(int);
        virtual const char* what() const noexcept;
    private:
        int _idx;
    };
};

我是C ++编程的新手,还没有学习C ++程序员如何习惯这样做?也许我们应该把类bad_index作为一个不完整的类型:

class conductor
{
    //some staff
private:
    class bad_index;
};

并使其完整并实现cpp - 文件中的所有成员函数。什么是正确的方法?

2 个答案:

答案 0 :(得分:1)

首先,由于bad_index是私有的,因此无法在类外引用,因此无法在catch(...)以外的异常处理程序中使用它。如果它不是真的需要(也就是说,例外仅用于内部使用),也许它不足以使它成为嵌套类,而是在实现文件中定义bad_index namespace { ... }

如果bad_index实际上是公共的,从技术上讲,您可以在.h文件中声明它并在.cpp文件中定义,但它将再次在类用户的catch子句中不可用,因为您即使通过引用也无法捕获不完整类型的异常,您只能再次catch(...)抓住它。

答案 1 :(得分:1)

如果该类不是顶级类的公共接口的一部分,那么将尽可能少的相关信息放入头文件中是有意义的,并且前向声明可以很好地完成该工作。但是,如果使用该异常的所有代码都在一个cpp文件中,那么你也可以避免在头文件中提及它并在cpp文件中的匿名命名空间中声明。