C++ 你能在C++;?
有一个具有clone()函数的对象类,该函数可以抛出CloneNotSupportedException*,并声明为clone()。CloneNotSupportedException派生自Exception,Exception派生自Object 继承需要完整的类型,我们有两个类型,所以很明显我们不能打破循环依赖。成员指针和指针参数是不完整类型的内容,但这似乎不足以用于抛出声明,即使我们抛出指针 类定义与实现分开,使用前向声明,指针无处不在。这还不够C++ 你能在C++;?,c++,class,inheritance,header,dependencies,C++,Class,Inheritance,Header,Dependencies,有一个具有clone()函数的对象类,该函数可以抛出CloneNotSupportedException*,并声明为clone()。CloneNotSupportedException派生自Exception,Exception派生自Object 继承需要完整的类型,我们有两个类型,所以很明显我们不能打破循环依赖。成员指针和指针参数是不完整类型的内容,但这似乎不足以用于抛出声明,即使我们抛出指针 类定义与实现分开,使用前向声明,指针无处不在。这还不够 有没有办法打破这种依赖性,或者这是不可能的C
有没有办法打破这种依赖性,或者这是不可能的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。你怎么能有效地抛出一个指针?自己做一个帮助,让你的异常类从auto\u ptr
”,而是“在03中使用boost::unique\u ptr
”。