自定义类错误:类型不完整,无法定义

时间:2015-10-27 09:18:01

标签: c++ class

我想定义一个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];
}

3 个答案:

答案 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和实现之后。