我想定义一个Add类以存储Big Integer并计算它的总和,但是当我尝试实例化该类时出错:
错误是:错误:类型不完整且无法定义
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
class Add;
int main()
{
char text[102];
Add sum; //error?
while(cin>>text)
{
if(text[0]=='0' && text[1]=='\0')
break;
Add num(text); //error?
sum+=num;
}
sum.display();
return 0;
}
class Add //Used to store and calculate big integer
{
public:
Add():text(NULL),numSize(0) { memset(arr,0,sizeof(arr)); }
Add(char *t);
Add& operator+=(Add& rhs);
void display();
private:
char* text;
int arr[110];
int numSize;
void toIntArr();
void toCharArr();
};
Add::Add(char* t):text(t),numSize(0)
{
memset(arr,0,sizeof(arr));
toIntArr();
while(t!='\0')
{
++numSize;
++t;
}
}
Add& Add::operator+=(Add& rhs)
{
int carryBit=0;
for(int i=0; i<numSize; ++i)
{
int sum=arr[i]+rhs.arr[i]+carryBit; //可以访问私有成员?
if(sum>=10)
{
arr[i]=sum/10;
carryBit=sum%10;
}
else
{
arr[i]=sum;
carryBit=0;
}
}
if(carryBit!=0)
arr[numSize++]=carryBit;
toCharArr();
return *this;
}
void Add::toIntArr()
{
for(int i=0; i<numSize; ++i)
arr[numSize-i-1]=text[i]-'0';
}
void Add::toCharArr()
{
for(int i=0; i<numSize; ++i)
text[numSize-i-1]=arr[i]+'0';
text[numSize]='\0';
}
void Add::display()
{
for(int i=0; i<numSize; ++i)
cout<<arr[i];
}
答案 0 :(得分:1)
当编译器实例化一个对象时,它应该知道正确分配内存的对象的大小。此外,cmpiler需要知道调用相应构造函数的构造函数声明。
在你的程序中,只在使用它之前声明该类。
class Add;
int main()
{
char text[102];
Add sum;
//...
因此编译器不知道如何创建对象sum
。将类定义放在main中使用之前。
或者将类定义放在标题中,并将此标题包含在带有main的模块中。
答案 1 :(得分:0)
有三种方法可以“定义”这个类:
前瞻性声明。这显示了最少的信息,它只是显示名称定义了一个类型(特别是一个类)。这就是你在顶部使用Add。
定义。类头及其方法。这是您的代码段class Add
开始,直到关闭它的};
。
实现类方法。
要“完成”,即使用一个类并声明它的实例,你需要第二级,即它需要“完全定义”。
如果它只是“向前宣布”,它也被称为“不完整”。您可以声明指针或引用它并通过函数传递它们。
为了拥有一个工作程序,该类需要有一个完整的定义,即它的所有方法。如果不是,它会在链接时断开。
通常,您在不同的“编译单元”中编写代码,因此main()
将合二为一,而Add
的方法的实现将放在另一个中,并且您将使用头文件放入Add
的定义,这样两个编译单元都可以看到它。
由于main
需要Add
的完整定义,因此需要在其后面显示。包含将“拉入”标题的代码。
在你的情况下,它写在一个长文件中,它必须出现在它之后,但是类实现和main()的位置可以按任何顺序出现。
答案 2 :(得分:-1)
主要功能应该在所有def和实现之后。