怎样在构造函数中不抛异常返回NULL

sevencat 2003-07-18 10:30:47
我想问一下,
class E
E *p=new E;
我在E的构造函数里面怎么写才能让p=NULL.
假如不用抛异常的方法。
...全文
517 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
sevencat 2003-07-21
  • 打赏
  • 举报
回复
今天我又从一个听来一方法,
另生成一个classfactory类,专门用于生成这些类的,
这样也不错。
谢谢楼上各位了。
Kidsheep 2003-07-18
  • 打赏
  • 举报
回复
用操作符new()的分配动作如下:

E *ptr = new E(255);
与下列双语句序列等价(如果class E没有重载new操作符的话)
// C++伪码
ptr = :: new( sizeof( E ) );
E::E( ptr, 255 );

所以你想做的操作实际上是不可能在new中完成的。
sevencat 2003-07-18
  • 打赏
  • 举报
回复
to RedSunRS(RedSun) :
假如在new里面有异常抛出的话,这个p的值就会是NULL,可能不用自己来设置,而且在VC里面缺省的new是不会抛内存分配异常的,(因此我想假如在构造函数里面有其他NEW出错的话,VC可能还会继续)假如自己在构造函数显式抛出异常的话,应该也会是NULL。现在的问题主要是我想在构造函数中进行一些判断比如
class E
{
E(int i);
}
我想达到的效果就是在这里进行判断,假如传入的这个参数i>255(根据其他情况可能会有变化)的话,我就想让这个NEW返回NULL,在重载NEW怎样将这个判断放到里面,
除了抛异常不知道有没有其他的办法,不然我只好抛异常了。
RedSunRS 2003-07-18
  • 打赏
  • 举报
回复
class E;
E* p;

try
{
p=new E;
}
catche( exception )
{
p = NULL;
}
//方法笨了一点,但很容易实现。其它方法不易实现。还有就是你应当保证构造函数
//正常执行,如果出现个异常,很多问题很难解决,如果这个类里new了其余的20个类,那怎么办?你可以在另一个如Initialize函数中做这种不保险的工作。_________/*(去掉此句所有的new指针最好保存在类成员函数中,这样不会有什么memory leak._______*/
RedSunRS 2003-07-18
  • 打赏
  • 举报
回复
class E;
E* p;

try
{
p=new E;
}
catche( exception )
{
p = NULL;
}
//方法笨了一点,但很容易实现。其它方法不易实现。还有就是你应当保证构造函数
//正常执行,如果出现个异常,很多问题很难解决,如果这个类里new了其余的20个类,那怎么办?你可以在另一个如Initialize函数中做这种不保险的工作。所有的new指针最好保存在类成员函数中,这样不会有什么memory leak.
sevencat 2003-07-18
  • 打赏
  • 举报
回复
抛异常就可以了吧,关键现在我不太想用异常来处理这些问题,因为老觉得异常好像影响一些速度,上面那位能不能给个例子,我先去试一下吧。
littlechang 2003-07-18
  • 打赏
  • 举报
回复
不行吧
构造函数是不能返回值的,連NULL也不行。
simouse 2003-07-18
  • 打赏
  • 举报
回复
关注
sevencat 2003-07-18
  • 打赏
  • 举报
回复
就是说在new里面执行一些判断,假如行的话就生成实例,否则返回?这样的话,我的构造函数是不是就可以不要了?
Kidsheep 2003-07-18
  • 打赏
  • 举报
回复
为了不让new抛出异常,可以声明其nothrow。

int *p = new(nothrow) int[100000];

如果分配失败,new返回0。
predawning 2003-07-18
  • 打赏
  • 举报
回复
好像构造函数做不到.
1.可以使用单体模式提供instance()接口返回NULL;同时使构造函数protected;
2.再一个就是重载一个operator new 返回空.
3.还有就是让你不能new出E就可以返回空了.
hpho 2003-07-18
  • 打赏
  • 举报
回复
应该是重载new吧
step_by_step 2003-07-18
  • 打赏
  • 举报
回复
kidsleep说的是对的。

不明白你为什么不喜欢异常?
sevencat 2003-07-18
  • 打赏
  • 举报
回复
谢谢各位,我也基本上放弃了这样的做法,
我后来又另外写了一个C程序,来做这个事情,唉,
难道一定要求助于C吗?
predawning 2003-07-18
  • 打赏
  • 举报
回复
如果说oo的话.我的理解是.在对象没有出现的时候.

就让它去作一些事情实在是有点困难.除非函数是静态的.

也就是用单体实现.增建instance()接口.判断i是否满足条件决定
是否new一个对象.否则返回空.

此外.构造函数只负责构造.够不够造并不能由它决定.这是你的责任.

就好像.你让一个不存在的东西,去决定自己是不是产生.

呵呵.我觉得不可行.你说呢?
sevencat 2003-07-18
  • 打赏
  • 举报
回复
to: predawning(拂晓)
vc中的缺省NEW是不抛异常也可以p=NULL,
标准库中的new是可以抛异常的,但可以用nothrow强制不抛异常,同时p=NULL

to:predawning(拂晓)
所以说我也不想用异常来处理这个问题,但是这个问题有其他办法吗?假如有C里面的话,就简单了。

是不是我每次要生成一个实例的时候,先判断一下(像上面那个i是不是小于255),如果是的话就new一个实例出来,我想我为什么不放到构造函数里面去处理这个呢,从OOP角度来看,我觉得可能放到构造函数里面好点。
sevencat 2003-07-18
  • 打赏
  • 举报
回复
to: predawning(拂晓)
vc中的缺省NEW是不抛异常也可以p=NULL,
标准库中的new是可以抛异常的,但可以用nothrow强制不抛异常,同时p=NULL

to:predawning(拂晓)
所以说我也不想用异常来处理这个问题,但是这个问题有其他办法吗?假如有C里面的话,就简单了。

是不是我每次要生成一个实例的时候,先判断一下(像上面那个i是不是小于255),如果是的话就new一个实例出来,我想我为什么不放到构造函数里面去处理这个呢,从OOP角度来看,我觉得可能放到构造函数里面好点。
predawning 2003-07-18
  • 打赏
  • 举报
回复
另外:我有点疑问就是,异常一般是在程序有错误时候,防止资源泄漏的技术.
并且,它执行的过程会跳出原来运行体.(有点象goto).所以,对于程序的逻辑.
应该尽量用一般编程逻辑实现.而用异常保证程序不会泄漏资源为好.这样的程序
行为才会清晰.
predawning 2003-07-18
  • 打赏
  • 举报
回复
要清楚一件事.如果构造函数抛了异常.那么这个对象就没有被构造.
这样只要让p=NULL;就可以了.
class E
E *p= NULL;
p = new E;//构造抛了异常.p应该还是NULL;
没抛异常.说明已经构造了对象.p有值.

64,683

社区成员

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

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