我在生产代码中遇到了以下概念:
class A
{
public:
class Exception : public std::exception
{/* ... */};
//...
};
没人能给我一个明确的答案,为什么会这样。我的问题是这种方法是否符合SOLID规则?我认为,如果此异常类位于类A的外部并在创建A的实例时被注入,那会更好。
答案 0 :(得分:2)
当您说“在创建A实例时注入”时,请注意Exception
是类型,而不是 object 。在相同类的实例中,您不能具有不同的 type 成员。
您可以在类模板的不同实例中使用不同的类型(即不同的类),但是对于本示例,您不需要模板。
类具有内部类型是完全正常的。您将所有辅助定义收集到一个容器中。 std::map
有18 member types。在这方面,类名范围与命名空间范围几乎相同。
答案 1 :(得分:1)
您可能需要阅读:https://en.cppreference.com/w/cpp/language/nested_types
因为您说“是在创建实例A时注入的”,所以我想澄清一下,Exception
被定义为内部类并不能使其成为A
实例的成员。 。如果要使其成为A
实例的成员,则必须在A
中明确声明该成员:Exception m_expections;
答案 2 :(得分:0)
我的问题是这种方法是否符合SOLID规则?
我认为没有SOLID支持或禁止这种情况。
由于命名和语义,我仍然会遇到一个问题:当您声明这样的异常时,它唯一的含义就是“由类A生成的异常类型”。这不能准确表示任何类型的错误情况(尽管我怀疑您有一个真正命名为A
的类,所以可能由于示例中选择的名称而失去了含义)。
如果类名确实是“ Exception”,则应将其重命名。在类中定义它对我来说也没有意义(我看不出有任何理由)。