在C ++上编译错误

时间:2011-01-08 22:12:26

标签: c++

有人可以解释为什么我不能编译这段代码?我知道这个设计很糟糕,但我只是想知道为什么我不能编译它,提前谢谢 附:对不起格式,在面板上找不到反引号

//Deriving classes definition 
class IntClass; class DoubleClass;

//The Virtual Number Class. IntClass and FloatClass will derive from this class.

class Number {
    public:
        //return a Number object that's the results of x+this, when x is DoubleClass
        virtual Number& addDouble(DoubleClass& x) = 0;

        //return a Number object that's the results of x+this, when x is IntClass
        virtual Number& addInt(IntClass& x) = 0;

        //return a Number object that's the results of x+this, when x is either
        //IntClass or DoubleClass
        virtual Number& operator+(Number& x) = 0;
};

class IntClass : public Number {
    private:
        int my_number;
    public:
        //Constructor
        IntClass(int n):my_number(n) {}

        //returns the number stored in the object
        int get_number()  {return my_number;}

        //return a DoubleClass object that's the result of x+this
        Number& addDouble(DoubleClass& x){
         return  x.addInt(*this);
        }

        //return an IntClass object that's the result of x+this
        Number& addInt(IntClass& x){
         IntClass* var = new IntClass(my_number + x.get_number());
         return  *var;
        }

        //return a Number object that's the result of x+this.
        //The actual class of the returned object depends on x.
        //If x is IntClass, then the result if IntClass.
        //If x is DoubleClass, then the results is DoubleClass.
        Number& operator+(Number& x){
         return x.addInt(*this);
        }
};

class DoubleClass : public Number {
    private:
        double my_number;
    public:
        //Constructor
        DoubleClass(double n):my_number(n) {}

        //returns the number stored in the object
        double get_number()  {return my_number;}

        //return a DoubleClass object that's the result of x+this
        Number& addDouble(DoubleClass& x){
         DoubleClass* var = new DoubleClass(my_number + x.get_number());
         return *var;
        }

        //return a DoubleClass object that's the result of x+this
        Number& addInt(IntClass& x){
         DoubleClass* var = new DoubleClass(my_number + x.get_number());
         return *var;
        }

        //return a DoubleClass object that's the result of x+this.
        //This should work if x is either IntClass or DoubleClass
        Number& operator+( Number& x){
         return x.addDouble(*this);
        }
};

我在addDouble方法中的IntClass中有错误:

invalid use of undefined type struct DoubleClass

已编辑 IntClass不是NumberClass的嵌套类

5 个答案:

答案 0 :(得分:2)

IntClass::addDouble内,您使用的是类DoubleClass,但此时DoubleClass只有一个前向声明,因此您无法在其上调用方法。

可以通过在IntClass::addDouble的完整声明之后放置class DoubleClass的正文,或者将代码分成标题和实现文件来解决此问题。

答案 1 :(得分:0)

如果基类中有pure virtual function,则派生类必须实现它。

答案 2 :(得分:0)

如果所有派生的类别必须实现您的纯虚函数(最后set = 0),例如addDouble,addInt,Number& operator +(Number& x)= 0,print_number

否则你在派生类中会有错误

在IntClass和DoubleClass中编写纯虚函数的实现

答案 3 :(得分:0)

重构代码,因此每个类声明都进入它自己的头文件Number.h,IntClass.h DoubleClass.h,实现进入编译单元IntClass.cpp和DoubleClass.cpp。

然后将IntClass.cpp引入#include DoubleClass.h,因为它使用该类。

然后它将编译。

然而,这段代码会非常严重泄漏,并且完全不是const-correct。这些问题也需要解决。也许返回智能指针而不是引用,或者是一个外部“持有者”类来管理它下面指针的生命周期。

为什么要重写数字系统?

答案 4 :(得分:0)

您有可见性问题,因为IntClassNumber的嵌套类而DoubleClass是常规类,但在声明之前使用它(因此单词DoubleClass第8行对编译器没有任何意义。)

解决方案可以在开头添加两个前进,然后通过在IntClass的定义之前添加一个右大括号来使所有三个类成为正常的顶级类。

class IntClass;
class DoubleClass;

然而,IntClass::addDouble的内联实现会出现问题,因为此时DoubleClass只知道是一个类(它是一个不完整的类型)。通过分离实现并在DoubleClass的定义之后移动它,您可以编译。

请注意,现在编译的代码仍然非常糟糕(特别是它正在泄漏)。