HugeCalc 没 copy constructor ?
一个最简单的程序居然通不过:L#include <iostream.h>#include "D:/HugeCalc/HugeCalc.h" // 公共接口
#include "D:/HugeCalc/HugeInt.h" // 10进制系统
#include "D:/HugeCalc/HugeIntX.h" // 16进制系统
#pragma message( "automatic link to D:/HugeCalc/HugeCalc.lib" )
#pragma comment( lib, "D:/HugeCalc/HugeCalc.lib" )
int GetNumTail(CHugeIntX d)
{
return d % 10;
}
int main(int argc, char* argv[])
{
CHugeIntX a(1234);
cout <<GetNumTail(a); // 出错的地方 !!!!!!!!!!!
system( "pause" );
return 0;
}编译程序,出错信息如下:--------------------Configuration: Test - Win32 Debug--------------------
Compiling...
Mail.cpp
F:\MyProjects\Test\Mail.cpp(18) : error C2664: 'GetNumTail' : cannot convert parameter 1 from 'class CHugeIntX' to 'class CHugeIntX'
No copy constructor available for class 'CHugeIntX'
Error executing cl.exe.
Test.exe - 1 error(s), 0 warning(s)以为是 VC 的问题,换过几张光盘重装,问题依旧
:'( :'( :'( :'( :'( :'(
但把函数调用去掉,直接 cout <<a % 10; ,就能编译通过,而且正常运行
请问怎么回事 ?? 注意其构造函数有关键字“explicit”限定:explicit CHugeIntX::CHugeIntX( CONST CHugeIntX& right );
它要求显式给出拷贝声明,使之更严谨,行为更受控。
另外,建议楼主将函数改成:int GetNumTail(const CHugeIntX& d)
{
return d % 10;
}将更高效(传引用)!因为免除了一个潜在的拷贝过程。
还有,建议使用 CHugeInt 类,就楼主的问题来说会更高效。 经常看到楼主来论坛,今天终于发首帖了,呵呵:) :handshake 1。应该怎样给出显式的拷贝声明??
我这样添加#include <iostream.h>
#include "D:/HugeCalc/HugeCalc.h" // 公共接口
#include "D:/HugeCalc/HugeInt.h" // 10进制系统
#include "D:/HugeCalc/HugeIntX.h" // 16进制系统
#pragma message( "automatic link to D:/HugeCalc/HugeCalc.lib" )
#pragma comment( lib, "D:/HugeCalc/HugeCalc.lib" )
CHugeInt::CHugeInt( CONST CHugeInt& right ); // 显式拷贝声明
int GetNumTail(const CHugeInt d)
{
return d % 10;
}
int main(int argc, char* argv[])
{
cout << HugeCalc::GetVer() << endl;
CHugeInt a(1234);
cout << endl <<GetNumTail(a) << endl;
system( "pause" );
return 0;
}编译后问题依旧
2。关于传引用更高效。我是想试一下 CHugeCalc 的拷贝构造函数。因为在一些复杂的计算中,传入的参数要参加计算,为了不改变原参数,需要拷贝一个备份,用备份参加计算。
不过 gxqcn 大虾给了我启发:#include <iostream.h>
#include "D:/HugeCalc/HugeCalc.h" // 公共接口
#include "D:/HugeCalc/HugeInt.h" // 10进制系统
#include "D:/HugeCalc/HugeIntX.h" // 16进制系统
#pragma message( "automatic link to D:/HugeCalc/HugeCalc.lib" )
#pragma comment( lib, "D:/HugeCalc/HugeCalc.lib" )
//CHugeInt::CHugeInt( CONST CHugeInt& right );
int GetNumDigitsSum(const CHugeInt& d)
{
CHugeInt t(d);
int i = 0;
while ( t > 0 )
{
i += t % 10;
t /= 10;
}
return i;
}
int main(int argc, char* argv[])
{
cout << HugeCalc::GetVer() << endl;
CHugeInt a(1234);
a.Pow(a);
cout << endl << a.GetStr() << endl;
cout << endl <<GetNumDigitsSum(a) << endl << endl;
system( "pause" );
return 0;
}就是大数要作为传入参数时,以常量引用形式传入,然后在函数里面再复制,这样就绕过了显式拷贝构造函数的声明。 :*-^ :*-^那是因为我很久不写程序了,忘记得差不多了,正在恶补 C 程序和数论,不好意思发帖子。再说潜水看各位牛人讨论问题也是很大的乐趣。:lol
页:
[1]