有一个带有clone()函数的Object类,它可以抛出CloneNotSupportedException *并且声明为此类。 CloneNotSupportedException派生自Exception,它派生自Object。
继承需要完整的类型,我们有两个,所以很明显我们不能破坏那里的循环依赖。成员指针和指针参数是不完整类型的内容,但即使我们抛出指针,这对于throw声明来说似乎还不够。
类定义与实现分开,使用前向声明,指向各处。这还不够。
有没有办法打破这种依赖,或者这在C ++中是不可能的?
答案 0 :(得分:7)
略过异常规范,它毫无价值。
class Object {
virtual Object* clone() = 0;
virtual ~Object() {}
};
完成。
顺便说一下,你的设计听起来完全错了,我不能让自己不去发表评论。
答案 1 :(得分:1)
#include <memory>
#ifndef NDEBUG
#include <typeinfo>
#endif
#include <cassert>
class Object {
public:
typedef std::unique_ptr<Object> Ptr; // C++0x. Use auto_ptr in 03.
virtual ~Object() { }
Ptr clone() const {
Ptr obj = cloneImpl();
assert( typeid(*obj) == typeid(*this) );
return obj;
}
private:
virtual Ptr cloneImpl() const = 0;
};
按值抛出异常并按const&
捕获它。如果您在throw
中CloneNotSupportedException
cloneImpl
例外,它将传播给可以处理它的来电者。
答案 2 :(得分:-1)
我不是C ++专家...但是这是一个(也是唯一的)我想被诱惑除了异常之外的东西......你可以抛出一个值类型,例如整数。我很高兴C ++语言设计师有理由禁止投掷指针......这会造成严重破坏。