数学研发论坛

 找回密码
 欢迎注册
查看: 2477|回复: 4

[求助] HugeCalc 没 copy constructor ?

[复制链接]
发表于 2008-8-28 21:59:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?欢迎注册

x
一个最简单的程序居然通不过
  1. #include <iostream.h>

  2. #include "D:/HugeCalc/HugeCalc.h"        // 公共接口
  3. #include "D:/HugeCalc/HugeInt.h"         // 10进制系统
  4. #include "D:/HugeCalc/HugeIntX.h"        // 16进制系统

  5. #pragma message( "automatic link to D:/HugeCalc/HugeCalc.lib" )
  6. #pragma comment( lib, "D:/HugeCalc/HugeCalc.lib" )

  7. int GetNumTail(CHugeIntX d)
  8. {
  9.         return d % 10;
  10. }

  11. int main(int argc, char* argv[])
  12. {
  13.                 CHugeIntX a(1234);               
  14.                 cout <<  GetNumTail(a); // 出错的地方 !!!!!!!!!!!
  15.         
  16.         system( "pause" );               
  17.         return 0;
  18. }
复制代码
编译程序,出错信息如下:
  1. --------------------Configuration: Test - Win32 Debug--------------------
  2. Compiling...
  3. Mail.cpp
  4. F:\MyProjects\Test\Mail.cpp(18) : error C2664: 'GetNumTail' : cannot convert parameter 1 from 'class CHugeIntX' to 'class CHugeIntX'
  5.         No copy constructor available for class 'CHugeIntX'
  6. Error executing cl.exe.

  7. Test.exe - 1 error(s), 0 warning(s)
复制代码
以为是 VC 的问题,换过几张光盘重装,问题依旧
:'(

但把函数调用去掉,直接
  1. cout <<  a % 10;
复制代码
,就能编译通过,而且正常运行

请问怎么回事 ??
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-8-28 22:41:56 | 显示全部楼层
注意其构造函数有关键字“explicit”限定:
explicit CHugeIntX::CHugeIntX( CONST CHugeIntX& right );


它要求显式给出拷贝声明,使之更严谨,行为更受控。

另外,建议楼主将函数改成:
int GetNumTail(const CHugeIntX& d)
{
        return d % 10;
}
将更高效(传引用)!因为免除了一个潜在的拷贝过程。

还有,建议使用 CHugeInt 类,就楼主的问题来说会更高效。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-8-28 22:44:23 | 显示全部楼层
经常看到楼主来论坛,今天终于发首帖了,呵呵
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-8-28 23:27:05 | 显示全部楼层
1。应该怎样给出显式的拷贝声明??

我这样添加
  1. #include <iostream.h>

  2. #include "D:/HugeCalc/HugeCalc.h"        // 公共接口
  3. #include "D:/HugeCalc/HugeInt.h"         // 10进制系统
  4. #include "D:/HugeCalc/HugeIntX.h"        // 16进制系统

  5. #pragma message( "automatic link to D:/HugeCalc/HugeCalc.lib" )
  6. #pragma comment( lib, "D:/HugeCalc/HugeCalc.lib" )

  7. CHugeInt::CHugeInt( CONST CHugeInt& right ); // 显式拷贝声明

  8. int GetNumTail(const CHugeInt d)
  9. {
  10.         return d % 10;
  11. }

  12. int main(int argc, char* argv[])
  13. {
  14.         cout << HugeCalc::GetVer() << endl;

  15.                 CHugeInt a(1234);
  16.        
  17.         cout << endl <<  GetNumTail(a) << endl;
  18.         
  19.     system( "pause" );               
  20.     return 0;
  21. }
复制代码
编译后问题依旧

2。关于传引用更高效。我是想试一下 CHugeCalc 的拷贝构造函数。因为在一些复杂的计算中,传入的参数要参加计算,为了不改变原参数,需要拷贝一个备份,用备份参加计算。
不过 gxqcn 大虾给了我启发:
  1. #include <iostream.h>

  2. #include "D:/HugeCalc/HugeCalc.h"        // 公共接口
  3. #include "D:/HugeCalc/HugeInt.h"         // 10进制系统
  4. #include "D:/HugeCalc/HugeIntX.h"        // 16进制系统

  5. #pragma message( "automatic link to D:/HugeCalc/HugeCalc.lib" )
  6. #pragma comment( lib, "D:/HugeCalc/HugeCalc.lib" )

  7. //CHugeInt::CHugeInt( CONST CHugeInt& right );

  8. int GetNumDigitsSum(const CHugeInt& d)
  9. {
  10.         CHugeInt t(d);
  11.         int i = 0;
  12.        
  13.         while ( t > 0 )
  14.         {
  15.                 i += t % 10;
  16.                 t /= 10;
  17.         }
  18.        
  19.         return i;
  20. }

  21. int main(int argc, char* argv[])
  22. {
  23.         cout << HugeCalc::GetVer() << endl;
  24.        
  25.         CHugeInt a(1234);
  26.        
  27.         a.Pow(a);
  28.        
  29.         cout << endl << a.GetStr() << endl;
  30.         cout << endl <<  GetNumDigitsSum(a) << endl << endl;
  31.    
  32.     system( "pause" );
  33.     return 0;
  34. }
复制代码
就是大数要作为传入参数时,以常量引用形式传入,然后在函数里面再复制,这样就绕过了显式拷贝构造函数的声明。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-8-28 23:36:06 | 显示全部楼层
  那是因为我很久不写程序了,忘记得差不多了,正在恶补 C 程序和数论,不好意思发帖子。再说潜水看各位牛人讨论问题也是很大的乐趣。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2020-11-30 03:46 , Processed in 0.061509 second(s), 16 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表