我需要如何声明成员类

How do I need to declare a member class?

本文关键字:声明 成员类 何声明      更新时间:2023-10-16

我需要使用一个自定义异常类,该类将在顶级类的函数成员中使用。因此,将自定义类作为成员类是合理的。以下是它们目前声明的文件:

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-文件中完成和实现所有成员功能。什么是正确的方法?

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

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

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