小众知识

首页 > 正文

构造函数的疑惑

为什么类的构造函数没有返回值?那么如果如下类A中,我想有条件的构造,如果num>10则不构造,但是问题是不能调用析构函数,该怎么处理?
class A

   A(int num){}
   ~A(){}
 };

//…………
A a(11);//这里11>10,构造失败,但是怎么析构它呢?  

 jyfcsdn 发表于:2003-08-12 20:10:11
得分:20 

构造函数的职责就是保证对本对象初始化,使得对象处于可用状态,当然有个前提就是外部传入的用于初始化的信息也必须合法,如果外部传入的数据不合法,我当然没法保证初始化成功,也就没法保证对象的行为不出现异常。所以,保证传入数据的合法应该是使用该对象的客户端代码的职责。把这些职责放入构造函数我觉得不妥。

所以我觉得应该如下使用
int iNum = ...;
A * pa = NULL;
if( !(iNum > 10))
{
  pa = new A(iNum);
}
else
{

 jyfcsdn 发表于:2003-08-12 20:13:26
得分:0 

当然,你可以通过在构造函数内抛出异常的方法来表示该类构造失败。
class A

   A(int num)
  {
     if(num > 10)
    { 
      throw YourException();
    }
   }
   ~A(){}
 };


try
{
   A * p = new A(100);
}
catch(YourException& e)
{
   //标示构造失败

 zcchm 发表于:2003-08-12 20:48:42
得分:0 

建议楼主看一下"虚构造函数", 可能会对你的问题有帮助. 

 yellowwolf 发表于:2003-08-12 21:15:59
得分:0 

#include 
class A{
 A* p;
 int inum;
public:
  A(int num) 
 { inum = num;
   p = this;  
   if (p->inum > 10)
    delete p; 
 }
 void Display () 
 {
   cout<   return;
 }
 ~A() {}
};
看一下,合不合你的要求啊。 

 vsfan 发表于:2003-08-12 21:53:22
得分:0 

考虑用接口类:
即:
A类中含B类
若不满足条件则在A的函数中B不构造即可 

 xxb51357 发表于:2003-08-13 17:47:50
得分:0 

这条语句何解:
CString str=CString("123");
右边CString返回的是什么呢? 

 zcchm 发表于:2003-08-13 19:54:19
得分:0 

CString str=new CString("123");



 jiangpeng 发表于:2003-08-13 20:04:46
得分:0 

CString str = CString("123");
这里的operator=不是赋值的意思,编译器会把上面的语句看成
CString str("123");
调用的还是CString::CString(const char*)这个构造函数,不存在什么返回值 

 limd 发表于:2003-08-13 20:39:03
得分:0 

如果 yellowwolf(你们把名给全起了所以我注册色狼) 这个可以的话,我看下面这个也可以
#include 
class A{
 int inum;
public:
  A(int num) 
 { inum = num;
   if (inum > 10)
    delete this; 
 }
 void Display () 
 {
   cout<   return;
 }
 ~A() {}
};
不过我还是比较用 jyfcsdn() 的。
至于
CString str = CString("123");
它是先产生了一个临时的匿名对象,然后用拷贝构造函数创建的。
不存在什么返回值,是因为系统知道应该返回什么,没有必要指定了(构造函数的返回值是针对同一个类是固定的,改不了)


 jiangpeng 发表于:2003-08-13 21:45:08
得分:0 

CString str = CString("123");
不会产生临时的匿名对象。其等价于CString str("123")调用的是个构造函数
CString str1 = str; //这里才会调用copy ctor 

 eric8231 发表于:2003-08-13 23:51:32
得分:0 

同意  vsfan(窘) 

用一个A_handle 类来管理A类的生成与销毁,并同时进行条件控制:

class A {
     int i_;
public:
     A(int i) { //... }
     ~A(){ //... }
};

class A_handle {
     A* pa;
public:
     A_handle(int i) { if(i<=10) pa=new A(i); }
     ~A_handle() { delete pa; }
};

main()
{
     A_handle a(0); 
     //use object a...


 xxb51357 发表于:2003-08-14 13:03:24
得分:0 

To:  yellowwolf(你们把名给全起了所以我注册色狼)
     limd(Limd)
你们的程序编译运行总出错,可能是在构造函数里面不能删除自身吧。

 zjxushengyong 发表于:2003-08-14 14:27:29
得分:0 

up... 

 ShadowBlade 发表于:2003-08-15 03:29:36
得分:0 

to: eric8231(小诗) 
  太臃肿了~
无论他是否new了一个pa,你的A_handle都已经构造了
最后还不是要判断pa是否new,不new做掉A_handle~
这个不需要类

class A {
     int i_;
public:
     A(int i) { //... }
     ~A(){ //... }
};

A* newpa(int n)
{
     if (n<=10)
         A *pa = new A(n);
     else
         return NULL;

     return pa;
}
不知道有没有语法错误~

这么麻烦~ 所以咯~ 我还是比较喜欢 jyfcsdn() 的抛出异常消息的做法。 

 yellowwolf 发表于:2003-08-15 20:42:43
得分:0 

xxb51357() 
 我的代码是应该会出现编译运行错误但如果小于10就OK吧。
所以呢,在if 后抛一石头把delete this 炸死。
我感觉eric8231(小诗) 的想法不错,: ShadowBlade(Thief)分析更好。虽然我不赞同这样做(还是jyfcsdn好的一点,我的改一下,跟他差不多,^@$@^) 但也是一种思路,也有它用途的一面。 

 bigwhiteshark 发表于:2003-08-17 21:57:03
得分:0 

http://www.csdn.net/Develop/Read_Article.asp?Id=20224 

 ergo 发表于:2003-08-28 02:18:59
得分:0 

A::A(int sum)

   ......;
   if(sum>10)
   delete this;
}
简单的一BO 

上一篇:求教:局部域定义了一个与全局域一样的函数(名子相同,参数相同),会报重复定义错误,为什么c++不覆盖全局域函数呢?
下一篇:Effective C++的一个疑问,有没有学习过这本书的人??

分享到: