【发布时间】:2021-12-18 21:10:46
【问题描述】:
假设我有一个你可以在下面看到的课程(请也阅读 cmets):
Foo.h
#pragma once
namespace Bar
{
class Foo
{
public:
inline Foo( );
private:
char c;
inline static const std::unordered_set<char> CHAR_SET {'/', '\\', '|', '-'};
friend class Invalid_C_Exception;
};
} // end of namespace Bar
我有:
Foo.cpp
#include "Foo.h"
using namespace Bar;
inline Foo::Foo( )
{
}
class Invalid_C_Exception : public std::exception
{
public:
virtual const char* what( ) const throw( )
{
std::stringstream ss;
ss << "Invalid_C_Exception: { ";
// compiler gives an error here because of usages of CHAR_SET
for ( auto it = Foo::CHAR_SET.cbegin( ); it != Foo::CHAR_SET.cend( ); ++it )
{
ss << "'" << *it << "', ";
}
return somehow_save_the_C_string(ss.str());
}
} Invalid_C_Exc;
第一个问题:
全局Invalid_C_Exc变量的存在好吗?
第二个问题:
为什么编译器会责备我 CHAR_SET 在尝试编译 Foo.cpp 时是私有的?
自定义异常类,尽管是 Foo 类的朋友,但无法访问 CHAR_SET?
第三个问题:
我应该把这些自定义异常类放在哪里?在单独的头文件和源文件中,但在同一个命名空间下?
我犹豫不决,所以我把声明和实现放在源文件Foo.cpp中,因为异常类是为Foo类设计的,所以它们是相互关联的。
【问题讨论】:
-
您真的需要自定义例外吗?有很多已经生成的异常类型 here 几乎涵盖了我遇到的大部分内容。
-
代码是关于细节的。当某些行不相关时,您应该删除它而不是要求忽略它
-
@NathanOliver 自定义异常是一种很好的做法。在“清洁代码”中,Robert C. Martin 解释了原因(Java 被用作示例,但推理也适用于 C++)。
标签: c++ class exception header-files