读书人

怎么放弃正在创建的对象

发布时间: 2012-02-07 17:45:36 作者: rapoo

如何放弃正在创建的对象?
hi every,
程序里面有好几个对象A、B、C、D。
B、C、D与A存在依赖关系,并且B、C、D都是在A的构建函数里创建的,
是否有办法在B、C、D中的某个对象创建不成功或者创建不完全时,直接放弃A的创建


[解决办法]
感觉就跟构造函数中抛出异常是同一个问题,但我还没有清醒的认识.
[解决办法]
up
[解决办法]
你说的依赖关系是怎么个依赖法?
[解决办法]
抛出异常就可以了。
[解决办法]
不知道这样行不行:
#include <iostream>
#include <string>

using namespace std;

class Error{
private:
string name;
public:
Error(){}
Error(string s):name(s){}
string getname(){
return name;
}
};

class A{
};

class B{
public:
B(){
A* a = new A;
a = 0;//test
if(a == 0){
throw Error( "faildtocreate ");
}
}
};

void main(){
try{
B b;
}
catch(Error e){
cout < <e.getname() < <endl;
}
}
[解决办法]
楼上的好像和楼主说的不大一样,而且代码问题也很多。比如异常抛出之后A*指向的对象无法销毁,string和Error传参的时候没有使用引用。
[解决办法]
悖论
[解决办法]
不要让构造函数抛异常。一旦引入异常,代码将极大程度复杂话。
C++之父说:把会失败的操作从构造函数里挪出来,让用户在对象构造完成后再调这个可能会失败的操作,并检测它是否真的失败了。
[解决办法]
构造函数里出现异常抛出是相当危险的事情

就像刀刃搁在脖子上一样,随时有抹一下的危险
[解决办法]
> > 不要让构造函数抛异常。一旦引入异常,代码将极大程度复杂话。
> > C++之父说:把会失败的操作从构造函数里挪出来,让用户在对象构造完成后再调这个可能会
> > 失败的操作,并检测它是否真的失败了。

构造函数不能抛出异常更会导致代码复杂化。

> > 构造函数里出现异常抛出是相当危险的事情
总比你析构的时候才发现没构造完整要安全得多。

[解决办法]
呃,来了个比C++之父还要牛的。喜欢在构造函数里抛异常,那就抛吧。
[解决办法]
曲解BS的意思算不得什么本事。在我眼前引申着我的意思,还能让我无法辩驳,这才是你的本事。
[解决办法]
不好. 也不应该.
[解决办法]
在构造函数中抛出异常是一个取消对象创建的 best practice,因为给对象引入一种 failed state 供检查才会更加复杂化代码。
[解决办法]

关于异常,不是有两本什么书给专门论证了么?
我记得结果好像是不抛出异常,至于为什么,已经忘了.

[解决办法]
公司编程守则明文禁止在构造函数里抛出异常:
Constructors should not throw exceptions
[解决办法]
< <more effective c++> > 条款10 以及 < <more exceptional c++> > 条款17和18

读书人网 >C++

热点推荐