C++ 你能在C++;?

C++ 你能在C++;?,c++,class,inheritance,header,dependencies,C++,Class,Inheritance,Header,Dependencies,有一个具有clone()函数的对象类,该函数可以抛出CloneNotSupportedException*,并声明为clone()。CloneNotSupportedException派生自Exception,Exception派生自Object 继承需要完整的类型,我们有两个类型,所以很明显我们不能打破循环依赖。成员指针和指针参数是不完整类型的内容,但这似乎不足以用于抛出声明,即使我们抛出指针 类定义与实现分开,使用前向声明,指针无处不在。这还不够 有没有办法打破这种依赖性,或者这是不可能的C

有一个具有clone()函数的对象类,该函数可以抛出CloneNotSupportedException*,并声明为clone()。CloneNotSupportedException派生自Exception,Exception派生自Object

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

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


有没有办法打破这种依赖性,或者这是不可能的C++?< /p> < p>我不是C++大师。但这是唯一一种(也是唯一一种)我会尝试抛出异常以外的东西的情况。。。可以抛出值类型,例如整数。我很高兴C++语言设计者有很好的禁止抛出指针的感觉…那会造成严重破坏。

跳过异常规范,它毫无价值

class Object {
    virtual Object* clone() = 0;
    virtual ~Object() {}
};
完成了

顺便说一句,你的设计听起来完全错误,我不能不对此发表评论。

\include
#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;
};
#ifndef NDEBUG #包括 #恩迪夫 #包括 类对象{ 公众: typedef std::unique_ptr ptr;//C++0x。在03中使用自动_ptr。 虚拟~Object(){} Ptr clone()常量{ Ptr obj=cloneImpl(); 断言(typeid(*obj)=typeid(*this)); 返回obj; } 私人: 虚拟Ptr cloneImpl()常量=0; };

只需按值抛出异常,并按常量捕获它&。如果您在
cloneImpl
中抛出
CloneNotSupportedException
异常,它将发送给调用者,调用者可以处理该异常。

请跟我重复。“C++不是Java”。“C++也不是C#”。“C++不是Java”。“我真的是说,C++不是java”。C++没有公共基类,这是一件好事。它有适当的复制构造函数,所以您不需要处理克隆函数,也不需要庞大的继承层次结构。当然,你几乎不应该在C++中使用指针(或者动态分配的对象)。请购买一本好的C++教材,试着学习语言,而不是在.cpp文件中编写java。你怎么能有效地抛出一个指针?自己做一个帮助,让你的异常类从 STD::异常< /C> >和CONTROL CONTRORM引用。我在C++中遇到的主要循环性是,当你为异常消息定义了String Trac类(这样,构建一个异常对象就不能抛出,而不是愚蠢的标准库设计),然后字符串载体类的某些操作可能需要抛出异常。。。我没有找到任何令人满意的答案。有一些变通办法,但它们让人觉得非常容易理解,非常做作,不好。@Frigo:你完全可以选择你自己的,我永远不会剥夺语言这样做的能力。这并不意味着不可能做得更好。OOP不是解决所有问题的方法——通用和功能编程在很多情况下提供了优越的解决方案——例如C++标准库的容器和算法。在C++中,我们不存在对象切片的问题,因为它可以通过不混合值类型和继承来避免,我们有智能指针。大多数时候,当你需要动态的、可定制的行为时,你使用一个容器。@ Frigo:哦,在C++社区中,我们通常将模式比如工厂和观察者作为不支持正确范式的语言的拐杖来实际解决问题,它们很少用于高质量的C++代码,因为我们不需要它们。例如,观察者模式只是java不支持函数作为数据的事实,而C++中有函数对象。是的,我做了,我看不出其他解决方案。<代码>克隆< <代码>方法不应该是代码> const <代码>吗?它们没有。不,不会的。事实上,堆栈分配的异常与嵌套的try…catch块和析构函数中的抛出有关。干扰堆栈展开或诸如此类的操作。@Frigo:“或诸如此类的操作”?也许你可以详细说明一下?因为显然,没有一个“正常”的C++权威知道这个问题,并且一致地建议不要抛出动态分配的异常。也许你应该把他的错误告诉斯特劳斯塔普?我要说的不是“在03中使用
auto\u ptr
”,而是“在03中使用
boost::unique\u ptr
”。