sunwukong 发表于 2008-8-28 21:59:42

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; ,就能编译通过,而且正常运行

请问怎么回事 ??

gxqcn 发表于 2008-8-28 22:41:56

注意其构造函数有关键字“explicit”限定:explicit CHugeIntX::CHugeIntX( CONST CHugeIntX& right );

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

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

还有,建议使用 CHugeInt 类,就楼主的问题来说会更高效。

gxqcn 发表于 2008-8-28 22:44:23

经常看到楼主来论坛,今天终于发首帖了,呵呵:) :handshake

sunwukong 发表于 2008-8-28 23:27:05

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;
}就是大数要作为传入参数时,以常量引用形式传入,然后在函数里面再复制,这样就绕过了显式拷贝构造函数的声明。

sunwukong 发表于 2008-8-28 23:36:06

:*-^ :*-^那是因为我很久不写程序了,忘记得差不多了,正在恶补 C 程序和数论,不好意思发帖子。再说潜水看各位牛人讨论问题也是很大的乐趣。:lol
页: [1]
查看完整版本: HugeCalc 没 copy constructor ?