一道面试题:C++构造函数无返回值,如何判断对象是否“构造”成功?

浪浪不会AI 2009-05-07 09:04:00
一道面试题,答案可能不惟一:

C++构造函数无返回值,如何判断对象是否“构造”成功?

 注意:这里的“构造”不是单指分配对象本身的内存,而是指在建立对象时做的初始化操作(如打开文件、连接数据库等)
...全文
2283 36 打赏 收藏 转发到动态 举报
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
kuangye1988 2009-11-21
  • 打赏
  • 举报
回复
参考symbian c++的设计规范吧~!两阶段构造!
lylm 2009-05-16
  • 打赏
  • 举报
回复
赞同29楼,

我们原来的项目中,很多构造函数都是空的,
这部分功能完全可以用initial和SetXXX等函数代替,这样就可以处理出错的情况
cnStreamlet 2009-05-16
  • 打赏
  • 举报
回复
二次构造?

C#/java 中抛异常似乎是出错处理的标准做法,而在 C++ 中却是应该尽量避免的
papaofdoudou 2009-05-16
  • 打赏
  • 举报
回复
mark
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 yshuise 的回复:]
书上是指出最好不在构造函数抛出异常。
构造其他对象,完全可以用其他函数代替实现。

[/Quote]
啥书
hjjdebug 2009-05-07
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 akirya 的回复:]
额外参数不行,有异常就不能正常工作了。
[/Quote]
额外参数可以判断对象构造成功,也可以判断构造不成功,例如文件没有打开,内存没有分配成功等。
但对系统抛出的异常不能处理。例如除0,不过通常也可以满足要求了。看具体使用环境吧。
bitxinhai 2009-05-07
  • 打赏
  • 举报
回复
  构造函数中抛出异常时概括性总结
  (1) C++中通知对象构造失败的唯一方法那就是在构造函数中抛出异常;
  (2) 构造函数中抛出异常将导致对象的析构函数不被执行;
  (3) 当对象发生部分构造时,已经构造完毕的子对象将会逆序地被析构;
  • 打赏
  • 举报
回复
Exceptional C+++Style中文版

CSDN有免费下载,赶紧的,楼主。
yshuise 2009-05-07
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 akirya 的回复:]
额外参数不行,有异常就不能正常工作了。
[/Quote]
我就是这个意思。因为楼主明显构造是复杂对象,在构造其他对象的时候,可以抛出异常的。
  • 打赏
  • 举报
回复
额外参数不行,有异常就不能正常工作了。
hjjdebug 2009-05-07
  • 打赏
  • 举报
回复
认为至少有两种方法可行
1: 在类的构造函数中抛出异常,在类对象创建时捕获异常
2: 在类的构造中添加类初始化成功与否的参数,在对象创建时检查这个返回结果。
这样的缺点是需要额外传递一个参数。
漁_夫 2009-05-07
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 taodm 的回复:]
哎,找本《exceptional C++》开始认真研究吧。
[/Quote]

同感,楼主问的这些问题,实际开发中常常遇到,但是很少有人总结,我以前就是乱凑代码。现在慢慢改正
taodm 2009-05-07
  • 打赏
  • 举报
回复
哎,找本《exceptional C++》开始认真研究吧。
yshuise 2009-05-07
  • 打赏
  • 举报
回复
因为在抛出异常那个地方,程序就在哪儿停止,bool或是函数根本不会执行的意思。
yshuise 2009-05-07
  • 打赏
  • 举报
回复
用bool变量,理论是是不可行,有漏洞的。
假如在一个构造函数里面构造多个对象,当构造一个成功的时候,
另外一个失败,在这个失败的对象里面跑出异常,此刻前面那个对象因没有释放,而
内存泄漏,bool可能根本就走不到哪儿去。
捕鲸叉 2009-05-07
  • 打赏
  • 举报
回复
如果不抛出异常,就表示成功吧
beyond071 2009-05-07
  • 打赏
  • 举报
回复
学习了
saturn254 2009-05-07
  • 打赏
  • 举报
回复
对于封装好的类来说,最好还是不用异常处理吧??

对于类的调用者来说 不清楚类中的具体实现,也不会在实例化类时(构造),进行异常处理
saturn254 2009-05-07
  • 打赏
  • 举报
回复
添加表示初始化成功与否的成员函数,当程序自动调用构造函数时,调用该成员函数判断“构造”是否成功


class Test
{
public:
Test()
{
}

bool fail()
{
if(condition)//失败
return ture;
else
return false;
//other code
....
}
LKStudio 2009-05-07
  • 打赏
  • 举报
回复
当然用异常抛出是最好的
加载更多回复(16)

65,168

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧