你能用C ++解决这个循环依赖问题吗?

时间:2011-07-03 09:56:18

标签: c++ class inheritance header dependencies

有一个带有clone()函数的Object类,它可以抛出CloneNotSupportedException *并且声明为此类。 CloneNotSupportedException派生自Exception,它派生自Object。

继承需要完整的类型,我们有两个,所以很明显我们不能破坏那里的循环依赖。成员指针和指针参数是不完整类型的内容,但即使我们抛出指针,这对于throw声明来说似乎还不够。

类定义与实现分开,使用前向声明,指向各处。这还不够。

有没有办法打破这种依赖,或者这在C ++中是不可能的?

3 个答案:

答案 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&捕获它。如果您在throwCloneNotSupportedException cloneImpl例外,它将传播给可以处理它的来电者。

答案 2 :(得分:-1)

我不是C ++专家...但是这是一个(也是唯一的)我想被诱惑除了异常之外的东西......你可以抛出一个值类型,例如整数。我很高兴C ++语言设计师有理由禁止投掷指针......这会造成严重破坏。