Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 异常成员类OOP_C++_Oop_Object_Solid Principles - Fatal编程技术网

C++ 异常成员类OOP

C++ 异常成员类OOP,c++,oop,object,solid-principles,C++,Oop,Object,Solid Principles,我在生产代码中遇到了以下概念: class A { public: class Exception : public std::exception {/* ... */}; //... }; 没有人能给我一个明确的答案为什么会这样。我的问题是,这种方法是否符合可靠的规则?我认为,如果该异常类位于类A之外,并且在创建A的实例时被注入,则会更好。您可能需要阅读: 因为您说“在创建实例A时被注入”,我想我需要澄清的是,Exception被定义为内部类并不意味着它是A实例的成员。如果

我在生产代码中遇到了以下概念:

class A
{
public:
    class Exception : public std::exception
    {/* ... */};
 //...
};
没有人能给我一个明确的答案为什么会这样。我的问题是,这种方法是否符合可靠的规则?我认为,如果该异常类位于类A之外,并且在创建A的实例时被注入,则会更好。

您可能需要阅读:

因为您说“在创建实例A时被注入”,我想我需要澄清的是,
Exception
被定义为内部类并不意味着它是
A
实例的成员。如果要使其成为
a
实例的成员,则必须在
a
中明确声明该成员:
异常m_expections

您可能需要阅读:

因为您说“在创建实例A时被注入”,我想我需要澄清的是,
Exception
被定义为内部类并不意味着它是
A
实例的成员。如果要使其成为
a
实例的成员,则必须在
a
中明确声明该成员:
异常m_expections

当您说“在创建实例时注入”时,请注意
异常
是一种类型,而不是对象。同一类的实例中不能有不同类型的成员

您可以在类模板的不同实例化中使用不同的类型(即不同的类),但对于本例,您不需要模板

类具有内部类型是完全正常的。将所有辅助定义收集到一个容器中<代码>标准::映射
已完成。类名作用域在这方面几乎与命名空间作用域相同。

当您说“在创建实例时注入”时,请注意,
Exception
是一个类型,而不是一个对象。同一类的实例中不能有不同类型的成员

您可以在类模板的不同实例化中使用不同的类型(即不同的类),但对于本例,您不需要模板

类具有内部类型是完全正常的。将所有辅助定义收集到一个容器中<代码>标准::映射
已完成。在这方面,类名范围与命名空间范围几乎相同

我的问题是,这种方法是否符合可靠的规则

我不认为有任何可靠的东西会支持或禁止这一点

由于命名和语义的原因,我仍然有一个问题:当您声明这样一个异常时,它唯一的意思就是“类a生成的异常类型”。这并不能准确地表示任何类型的错误条件(尽管我怀疑您是否真的有一个名为
a
的类,因此可能由于示例中选择的名称而失去了意义)

如果类名真的是“Exception”,您可能应该重命名它。在类中定义它对我来说也没有意义(我看不出有什么理由)

我的问题是,这种方法是否符合可靠的规则

我不认为有任何可靠的东西会支持或禁止这一点

由于命名和语义的原因,我仍然有一个问题:当您声明这样一个异常时,它唯一的意思就是“类a生成的异常类型”。这并不能准确地表示任何类型的错误条件(尽管我怀疑您是否真的有一个名为
a
的类,因此可能由于示例中选择的名称而失去了意义)


如果类名真的是“Exception”,您可能应该重命名它。在类中定义它对我来说也没有意义(我看不出有什么理由)。

设计原则很重要,但它们没有被遵循“因为它们是设计原则”。他们被跟踪是因为他们完成了一些事情。在构造时注入异常对象将实现什么?现在,类应该管理这个对象的生命周期。如果从未遇到错误状态,并且从未抛出该错误状态,该怎么办?您是对的。注入是不必要的,因为独立异常类将“以正常方式”对类A可用。然而,我仍然无法解释为什么异常类应该是类a的成员。我认为如果你继续并实现你的建议,你会找到答案。如果这是一个特定于
a
的错误,那么编写
catch(a::exception const&e){..
感觉有点“干净”。取决于可重复使用的错误量或特定于
A
的错误量。我认为没有一个包罗万象的答案。这取决于所讨论的类型,在很大程度上是一种判断。但我个人认为,错误是类接口的一部分是有道理的。设计原则很重要,但它们并没有得到遵守,“因为它们是设计原则”。他们被跟踪是因为他们完成了一些事情。在构造时注入异常对象将实现什么?现在,类应该管理这个对象的生命周期。如果从未遇到错误状态,并且从未抛出该错误状态,该怎么办?您是对的。注入是不必要的,因为独立异常类将“以正常方式”对类A可用。然而,我仍然无法解释为什么异常类应该是类a的成员。我认为如果你继续并实现你的建议,你会找到答案。如果这是一个特定于
a
的错误,那么编写
catch(a::exception const&e){..
感觉有点“干净”。取决于可重复使用的错误量或特定于
A
的错误量。我认为没有一个包罗万象的答案。这取决于所讨论的类型,在很大程度上是一种判断。但我个人认为错误是类接口的一部分是有道理的。