【发布时间】:2011-09-27 13:52:52
【问题描述】:
有一个带有 clone() 函数的 Object 类,它可以抛出 CloneNotSupportedException* 并被声明为这样。 CloneNotSupportedException 派生自 Exception,Exception 派生自 Object。
继承需要完整的类型,我们有两个,所以很明显我们不能打破循环依赖。成员指针和指针参数是不完整类型的内容,但这对于 throw 声明来说似乎是不够的,即使我们抛出指针也是如此。
类定义与实现分开,使用前向声明,到处都是指针。这还不够。
有没有办法打破这种依赖关系,或者这在 C++ 中是不可能的?
【问题讨论】:
-
跟着我重复。 “C++ 不是 Java”。 “C++ 也不是 C#”。 “C++ 不是 Java”。 “我是认真的,C++ 不是 Java”。 C++ 没有通用的基类,这是一件好事。它有适当的复制构造函数,所以你不需要弄乱克隆函数,它也不需要需要巨大的继承层次结构。而且,当然,您几乎不应该在 C++ 中使用指针(或动态分配的对象)。请购买好的 C++ 教科书,并尝试学习该语言,而不是在 .cpp 文件中编写 Java。
-
如何有效地抛出一个指针?帮自己一个忙,让您的异常类派生自
std::exception并通过 const-reference 捕获。 -
我在 C++ 中遇到的异常的主要循环是,当您为异常消息定义字符串载体类时(这样构造异常对象就不会抛出,而不是愚蠢的标准库设计) ,那么字符串载体类的一些操作可能需要抛出异常......我还没有找到任何令人满意的答案。有一些变通方法,但它们感觉非常不自然,非常做作,不好。
-
@Frigo:你完全可以选择你自己的,我永远不会剥夺语言这样做的能力。这并不意味着不可能做得更好。 OOP 并不是所有问题的解决方案——通用和函数式编程在许多情况下提供了非常出色的解决方案——例如,C++ 标准库的容器和算法。在 C++ 中,我们没有对象切片的问题,因为它很容易通过不混合值类型和继承来避免,我们为此提供了智能指针。大多数时候,当您需要动态的、可定制的行为时,您会使用容器。
-
@Frigo:哦,在 C++ 社区中,我们通常将诸如工厂和观察者之类的模式视为不支持正确范式来实际解决问题的语言的拐杖,而且它们很少用于高质量的 C++ 代码,因为我们只是不需要它们。例如,观察者模式只是对 Java 不支持函数作为数据这一事实的一种破解,而在 C++ 中我们有函数对象。
标签: c++ class inheritance header dependencies