有人可以解释为什么我不能编译这段代码?我知道这个设计很糟糕,但我只是想知道为什么我不能编译它,提前谢谢 附:对不起格式,在面板上找不到反引号
//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的嵌套类
答案 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)
您有可见性问题,因为IntClass
是Number
的嵌套类而DoubleClass
是常规类,但在声明之前使用它(因此单词DoubleClass
第8行对编译器没有任何意义。)
解决方案可以在开头添加两个前进,然后通过在IntClass
的定义之前添加一个右大括号来使所有三个类成为正常的顶级类。
class IntClass;
class DoubleClass;
然而,IntClass::addDouble
的内联实现会出现问题,因为此时DoubleClass
只知道是一个类(它是一个不完整的类型)。通过分离实现并在DoubleClass
的定义之后移动它,您可以编译。
请注意,现在编译的代码仍然非常糟糕(特别是它正在泄漏)。