C++类名做函数返回类型出错

u010376543 2013-12-03 10:56:31
这是一个函数,
CBigInt& CBigInt::Mov(CBigInt& A)
{
…………
return *this;
}

CBigInt是定义的一个类名,但是会报错:“CBigInt”不是类型名,还请各位帮帮忙,谢谢。
...全文
274 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
FrankHB1989 2013-12-04
  • 打赏
  • 举报
回复
引用 3 楼 qianhen123 的回复:
你这个函数返回值的是一个类的引用,不应该返回this指针吧。
fluent interface idiom罢了,你咋不问ostream的copy ctor怎么写的。
sleeplacker 2013-12-04
  • 打赏
  • 举报
回复
抛开你的长程序,怎么会报错,执行得好好的
#include <iostream>

class CBigInt
{
public:
	CBigInt& Mov(CBigInt&);
};

CBigInt& CBigInt::Mov(CBigInt& A)
{
		return *this;
}

int main()
{
	return 0;
}
你确定是这个问题吗
Novelian 2013-12-04
  • 打赏
  • 举报
回复
编译一下,看看报的哪些错误。可能是类定义时内部有一处错误,导致未定义成功。 另外返回引用要小心对象的生命周期。
u010376543 2013-12-03
  • 打赏
  • 举报
回复
引用 12 楼 ForestDB 的回复:
贴完整并且格式化的代码 可以编译,然后在warning或者error上双击,跳转到相应的代码; 就算没有编译,IDE给出了红色的波浪线,请在波浪线附近看看(不光向后看,也要向前看几行)
好的,谢谢,我在收拾一会~~~
ForestDB 2013-12-03
  • 打赏
  • 举报
回复
贴完整并且格式化的代码 可以编译,然后在warning或者error上双击,跳转到相应的代码; 就算没有编译,IDE给出了红色的波浪线,请在波浪线附近看看(不光向后看,也要向前看几行)
u010376543 2013-12-03
  • 打赏
  • 举报
回复
引用 10 楼 ForestDB 的回复:
class CBigInt { public: ... }CBigInt; 不知道我有没有看错?
不不不……那个地方我知道,忘记删了……
ForestDB 2013-12-03
  • 打赏
  • 举报
回复
class CBigInt { public: ... }CBigInt; 不知道我有没有看错?
u010376543 2013-12-03
  • 打赏
  • 举报
回复
这个代码应该没问题,是直接从网上copy的,但是不知道为什么到我的电脑上就不行了
u010376543 2013-12-03
  • 打赏
  • 举报
回复
引用 7 楼 ForestDB 的回复:
报错的地方是否有双击?
用vs2010写的,只是显示了红波浪线
ForestDB 2013-12-03
  • 打赏
  • 举报
回复
报错的地方是否有双击?
u010376543 2013-12-03
  • 打赏
  • 举报
回复
引用 4 楼 qianhen123 的回复:
把程序copy来看看
好的 #include <string> using namespace std; #define BI_MAXLEN 40 #define DEC 10 #define HEX 16 class CBigInt { public: int m_nSign;//记录大数的符号,支持负值运算 int m_nLength;//记录0x10000000进制的位数,0-40之间,相当于2进制的0-1280位 unsigned long m_ulvalue[BI_MAXLEN];// file://记录每一位的“数字” CBigInt(); ~CBigInt(); //将大数赋值为另一个大数 CBigInt& Mov(CBigInt& A); //将大数赋值为编译器能够理解的任何整形常数或变量 CBigInt& Mov(unsigned __int64 A); //比较两个大数大小 int Cmp(CBigInt& A); //计算两个大数的和 CBigInt Add(CBigInt& A); //重载函数以支持大数与普通整数相加 CBigInt Add(long A); //计算两个大数的差 CBigInt Sub(CBigInt& A); //重载函数以支持大数与普通整数相减 CBigInt Sub(long A); //计算两个大数的积 CBigInt Mul(CBigInt& A); //重载函数以支持大数与普通整数相乘 CBigInt Mul(long A); //计算两个大数的商 CBigInt Div(CBigInt& A); //重载函数以支持大数与普通整数相除 CBigInt Div(long A); //计算两个大数相除的余数 CBigInt Mod(CBigInt& A); //重载函数以支持大数与普通整数相除求模 long Mod(long A); //将输入的10进制或16进制字符串转换成大数 int InPutFromStr(string& str, const unsigned int system); //将大数按10进制或16进制格式输出到字符串 int OutPutToStr(string& str, const unsigned int system); //欧几里德算法求:Y=X.Euc(A),使满足:YX mod A = 1 CBigInt Euc(CBigInt& A); //蒙哥马利算法求:Y=X.Mon(A,B),使满足:X^A mod B = Y CBigInt Mon(CBigInt& A, CBigInt& B); }CBigInt; ///////////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "BigInt.h" //#include <CBigInt.h> //初始化大数为0 CBigInt::CBigInt() { m_nSign=1; m_nLength=1; for(int i=0;i<BI_MAXLEN;i++) m_ulvalue[i]=0; } //采用缺省的解构函数 CBigInt::~CBigInt() { } //大数比较,如果大数A位数比大数B多,当然A>B //如果位数相同,则从高位开始比较,直到分出大小 int CBigInt::Cmp(CBigInt& A) { if(m_nLength>A.m_nLength) return 1; if(m_nLength<A.m_nLength) return -1; for(int i=m_nLength-1;i>=0;i--) { if(m_ulvalue>A.m_ulvalue) return 1; if(m_ulvalue<A.m_ulvalue) return -1; } return 0; } //照搬参数的各属性 CBigInt& CBigInt::Mov(CBigInt& A) { m_nLength=A.m_nLength; for(int i=0;i<BI_MAXLEN;i++) m_ulvalue[i]=A.m_ulvalue[i];////////////////////////////////////////////////////// return *this; } //大数相加 //调用形式:N.Add(A),返回值:N+A /******************************************************************/ /* 例如: A B C + D E -------------- = S F G H 其中,若C+E<=0xffffffff,则H=C+E,carry(进位标志)=0 若C+E>0xffffffff,则H=C+E-0x100000000,carry=1 若B+D+carry<=0xfffffff,则G=B+D,carry=0 若B+D+carry>0xfffffff,则G=B+D+carry-0x10000000,carry=1 若carry=0,则F=A,S=0 若carry=1,A<0xfffffff,则F=A+1,S=0 若carry=1,A=0xfffffff,则F=0,S=1 */ /*****************************************************************/ CBigInt CBigInt::Add(CBigInt& A) { CBigInt X; if(X.m_nSign==A.m_nSign) { X.Mov(*this); int carry=0; unsigned __int64 sum=0; if(X.m_nLength<A.m_nLength) X.m_nLength=A.m_nLength; for(int i=0;i<X.m_nLength;i++) { sum=A.m_ulvalue; sum=sum+X.m_ulvalue+carry; X.m_ulvalue=(unsigned long)sum; if(sum>0xffffffff) carry=1; else carry=0; } if(X.m_nLength<BI_MAXLEN) { X.m_ulvalue[X.m_nLength]=carry; X.m_nLength+=carry; } return X; } else { X.Mov(A); X.m_nSign=1-X.m_nSign; return Sub(X); } } //大数相减 //调用形式:N.Sub(A),返回值:N-A //若两大数符号相同,其值相减,否则改变参数符号再调用大数相加函数 /******************************************************************/ /* 例如: A B C - D E -------------- = F G H 其中,若C>=E,则H=C-E,carry(借位标志)=0 若C<E,则H=C-E+0x100000000,carry=1 若B-carry>=D,则G=B-carry-D,carry=0 若B-carry<D,则G=B-carry-D+0x10000000,carry=1 若carry=0,则F=A 若carry=1,A>1,则F=A-1 若carry=1,A=1,则F=0 */ /*****************************************************************/ //CBigInt Sub(CBigInt& A); CBigInt CBigInt::Sub(CBigInt& A) { CBigInt X; if(m_nSign==A.m_nSign) { X.Mov(*this); int cmp=X.Cmp(A); if(cmp==0) { X.Mov(0); return X; } int len,carry=0; unsigned __int64 num; unsigned long *s,*d; if(cmp>0) { s=X.m_ulvalue; d=A.m_ulvalue; len=X.m_nLength; } if(cmp<0) { s=A.m_ulvalue; d=X.m_ulvalue; len=A.m_nLength; X.m_nSign=1-X.m_nSign; } for(int i=0;i<len;i++) { if((s-carry)>=d) { X.m_ulvalue=s-carry-d; carry=0; } else { num=0x100000000+s; X.m_ulvalue=(unsigned long)(num-carry-d); carry=1; } } while(X.m_ulvalue[len-1]==0) len--; X.m_nLength=len; return X; } else { X.Mov(A); X.m_nSign=1-X.m_nSign; return Add(X); } } //大数相乘 //调用形式:N.Mul(A),返回值:N*A /******************************************************************/ /* 例如: A B C * D E ---------------- = S F G H + T I J K ---------------- = U V L M N 其中,SFGH=ABC*E,TIJK=ABC*D 而对于: A B C * E ------------- = S F G H 其中,若C*E<=0xffffffff,则H=C*E,carry(进位标志)=0 若C*E>0xffffffff,则H=(C*E)&0xffffffff carry=(C*E)/0xffffffff 若B*E+carry<=0xffffffff,则G=B*E+carry,carry=0 若B*E+carry>0xffffffff,则G=(B*E+carry)&0xffffffff carry=(B*E+carry)/0xffffffff 若A*E+carry<=0xffffffff,则F=A*E+carry,carry=0 若A*E+carry>0xffffffff,则F=(A*E+carry)&0xffffffff carry=(A*E+carry)/0xffffffff S=carry */ /*****************************************************************/ CBigInt CBigInt::Mul(CBigInt& A) { CBigInt X,Y; unsigned __int64 mul; unsigned long carry; for(int i=0;i<A.m_nLength;i++) { Y.m_nLength=m_nLength; carry=0; for(int j=0;j<m_nLength;j++) { mul=m_ulvalue[j]; mul=mul*A.m_ulvalue+carry; Y.m_ulvalue[j]=(unsigned long)mul; carry=(unsigned long)(mul>>32); } if(carry&&(Y.m_nLength<BI_MAXLEN)) { Y.m_nLength++; Y.m_ulvalue[Y.m_nLength-1]=carry; } if(Y.m_nLength<BI_MAXLEN-i) { Y.m_nLength+=i; for(int k=Y.m_nLength-1;k>=i;k--) Y.m_ulvalue[k]=Y.m_ulvalue[k-i]; for(k=0;k<i;k++) Y.m_ulvalue[k]=0; } X.Mov(X.Add(Y)); } if(m_nSign+A.m_nSign==1) X.m_nSign=0; else X.m_nSign=1; return X; } //大数相除 //调用形式:N.Div(A),返回值:N/A //除法的关键在于“试商”,然后就变成了乘法和减法 //这里将被除数与除数的试商转化成了被除数最高位与除数最高位的试商 CBigInt CBigInt:iv(CBigInt& A) { CBigInt X,Y,Z; int len; unsigned __int64 num,div; unsigned long carry=0; Y.Mov(*this); while(Y.Cmp(A)>0) { if(Y.m_ulvalue[Y.m_nLength-1]>A.m_ulvalue[A.m_nLength-1]) { len=Y.m_nLength-A.m_nLength; div=Y.m_ulvalue[Y.m_nLength-1]/(A.m_ulvalue[A.m_nLength-1]+1); } else if(Y.m_nLength>A.m_nLength) { len=Y.m_nLength-A.m_nLength-1; num=Y.m_ulvalue[Y.m_nLength-1]; num=(num<<32)+Y.m_ulvalue[Y.m_nLength-2]; if(A.m_ulvalue[A.m_nLength-1]==0xffffffff) div=(num>>32); else div=num/(A.m_ulvalue[A.m_nLength-1]+1); } else { X.Mov(X.Add(1)); break; } Z.Mov(div); Z.m_nLength+=len; for(int i=Z.m_nLength-1;i>=len;i--) Z.m_ulvalue=Z.m_ulvalue[i-len]; for(i=0;i<len;i++) Z.m_ulvalue=0; X.Mov(X.Add(Z)); Z.Mov(Z.Mul(A)); Y.Mov(Y.Sub(Z)); } if(Y.Cmp(A)==0) X.Mov(X.Add(1)); if(m_nSign+A.m_nSign==1) X.m_nSign=0; else X.m_nSign=1; return X; } //大数求模 //调用形式:N.Mod(A),返回值:N%A //求模与求商原理相同 CBigInt CBigInt::Mod(CBigInt& A) { CBigInt X,Y; int len; unsigned __int64 num,div; unsigned long carry=0; X.Mov(*this); while(X.Cmp(A)>0) { if(X.m_ulvalue[X.m_nLength-1]>A.m_ulvalue[A.m_nLength-1]) { len=X.m_nLength-A.m_nLength; div=X.m_ulvalue[X.m_nLength-1]/(A.m_ulvalue[A.m_nLength-1]+1); } else if(X.m_nLength>A.m_nLength) { len=X.m_nLength-A.m_nLength-1; num=X.m_ulvalue[X.m_nLength-1]; num=(num<<32)+X.m_ulvalue[X.m_nLength-2]; if(A.m_ulvalue[A.m_nLength-1]==0xffffffff)div=(num>>32); else div=num/(A.m_ulvalue[A.m_nLength-1]+1); } else { X.Mov(X.Sub(A)); break; } Y.Mov(div); Y.Mov(Y.Mul(A)); Y.m_nLength+=len; for(int i=Y.m_nLength-1;i>=len;i--)Y.m_ulvalue=Y.m_ulvalue[i-len]; for(i=0;i<len;i++)Y.m_ulvalue=0; X.Mov(X.Sub(Y)); } if(X.Cmp(A)==0)X.Mov(0); return X; } //暂时只给出了十进制字符串的转化 int CBigInt::InPutFromStr(CString& str, const unsigned int system=DEC) { int len=str.GetLength(); Mov(0); for(int i=0;i<len;i++) { Mov(Mul(system)); int k=str-48; Mov(Add(k)); } return 0; } //暂时只给出了十进制字符串的转化 int CBigInt::OutPutToStr(CString& str, const unsigned int system=DEC) { str=""; char ch; CBigInt X; X.Mov(*this); while(X.m_ulvalue[X.m_nLength-1]>0) { ch=X.Mod(system)+48; str.Insert(0,ch); X.Mov(X.Div(system)); } return 0; } //欧几里德算法求:Y=X.Euc(A),使满足:YX mod A=1 //相当于对不定方程ax-by=1求最小整数解 //实际上就是初中学过的辗转相除法 /********************************************************************/ /* 例如:11x-49y=1,求x 11 x - 49 y = 1 a) 49%11=5 -> 11 x - 5 y = 1 b) 11%5 =1 -> x - 5 y = 1 c) 令y=1 代入c)式 得x=6 令x=6 代入b)式 得y=13 令y=13 代入a)式 得x=58 */ /********************************************************************/ CBigInt CBigInt::Euc(CBigInt& A) { CBigInt X,Y; X.Mov(*this); Y.Mov(A); if((X.m_nLength==1)&&(X.m_ulvalue[0]==1))return X; if((Y.m_nLength==1)&&(Y.m_ulvalue[0]==1)){X.Mov(X.Sub(1));return X;} if(X.Cmp(Y)==1)X.Mov(X.Mod(Y)); else Y.Mov(Y.Mod(X)); X.Mov(X.Euc(Y)); Y.Mov(*this); if(Y.Cmp(A)==1) { X.Mov(X.Mul(Y)); X.Mov(X.Sub(1)); X.Mov(X.Div(A)); } else { X.Mov(X.Mul(A)); X.Mov(X.Add(1)); X.Mov(X.Div(Y)); } return X; } //蒙哥马利算法求:Y=X.Mon(A,B),使满足:X^A mod B=Y //俺估计就是高中学过的反复平方法 CBigInt CBigInt::Mon(CBigInt& A, CBigInt& B) { CBigInt X,Y,Z; X.Mov(1); Y.Mov(*this); Z.Mov(A); while((Z.m_nLength!=1)||Z.m_ulvalue[0]) { if(Z.m_ulvalue[0]&1) { Z.Mov(Z.Sub(1)); X.Mov(X.Mul(Y)); X.Mov(X.Mod(B)); } else { Z.Mov(Z.Div(2)); Y.Mov(Y.Mul(Y)); Y.Mov(Y.Mod(B)); } } return X; }
u010376543 2013-12-03
  • 打赏
  • 举报
回复
引用 2 楼 ForestDB 的回复:
头文件怎么写的?
头文件是 #include "stdafx.h" #include "BigInt.h"
攻城狮凌风 2013-12-03
  • 打赏
  • 举报
回复
把程序copy来看看
攻城狮凌风 2013-12-03
  • 打赏
  • 举报
回复
你这个函数返回值的是一个类的引用,不应该返回this指针吧。
ForestDB 2013-12-03
  • 打赏
  • 举报
回复
头文件怎么写的?
u010376543 2013-12-03
  • 打赏
  • 举报
回复
自己先顶一下

64,670

社区成员

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

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