构造函数可以返回NULL值吗?

San*_*099 30 c++ null constructor return

我知道构造函数不会"返回"任何东西,但是例如,如果我调用CMyClass *object = new CMyClass()是否有任何方法使对象为NULL如果构造函数失败?在我的情况下,我有一些必须加载的图像,如果文件读取失败,我希望它返回null.有没有办法做到这一点?
提前致谢.

Mic*_*zek 27

我同意其他人你应该使用异常,但如果你确实需要因某些原因使用NULL,请将构造函数设为私有并使用工厂方法:

static CMyClass* CMyClass::create();
Run Code Online (Sandbox Code Playgroud)

这意味着你不能正常构造实例,并且你不能再在堆栈上分配它们,这是一个相当大的缺点.

  • @Steven可能,但我讨厌人们拒绝回答问题,因为他们认为海报做错了事; 完全有可能他(或一些未来的读者寻找这个问题的答案)有合理的需要,需要很长时间向我们解释 (10认同)
  • @Sanctus你的构造函数应该如何使用堆栈实例"返回null"? (3认同)
  • @Michael:我很欣赏你确实试着回答这个问题,但我认为我们有责任*告诉别人他们的问题何时被打破.这就是为什么我不假装我的答案应该被接受或者你的答案应该是一个downvote. (3认同)

Dav*_*eas 22

构造函数不返回值.它们初始化一个对象,报告错误的唯一方法是通过异常.

请注意,构造函数不进行任何类型的内存管理.内存分配,然后调用构造函数初始化它.并且该内存可以动态分配(type *x = new type;)但它也可以在stack(type x;)或更复杂类型的子对象中.除了第一种情况之外的所有情况,null根本没有意义.


Ara*_*raK 9

"正确的"**方式是抛出异常.

**你可以提供一个成员函数is_valid,你可以在构造一个对象后检查,但这在C++中不是惯用的.


use*_*019 6

这样做的方法是,如果你发现在你的构造函数中没有工作的东西,你应该抛出异常.如果C++无法为您的对象分配内存,则会发生这种情况 - 它会抛出std :: bad_alloc.您应该使用std :: exception或子类.

  • 有两种新的,常规将抛出,但你可以使用nothrow版本,如果它无法分配内存将返回空指针.同样,答案是正确的,因为在调用构造函数之前,返回空指针的选择仅适用于内存分配失败*. (4认同)