#include <iostream>
using namespace std;
class Rectangle;
int main(){
Rectangle myRoom(5,10);
cout << myRoom.getHeight() << endl;
cout << myRoom.getLength() << endl;
system("pause");
return 0;
}
class Rectangle{
private:
int height;
int length;
public:
Rectangle(int aHeight, int aLength){
height = aHeight;
length = aLength;
}
int getHeight(){
return height;
}
int getLength(){
return length;
}
};
编译器告诉我Rectangle,getHeight和getLength是未定义的。为什么我的类Rectangle没有原型,所以我可以在main方法下定义它?有人能告诉我我做错了什么吗?谢谢。
答案 0 :(得分:2)
此:
class Rectangle;
是前向声明,它基本上告诉编译器,但是Rectangle
类存在。由于编译器不了解此类的任何其他内容,Rectangle
是不完整类型。
在这一行:
Rectangle myRoom(5,10);
您正在尝试创建类Rectangle
的实例,尽管之前尚未定义类Rectangle
。当然,在这种情况下,前瞻性声明是不够的。类型Rectangle
仍然不完整。
看一下When can I use a forward declaration?,你会发现一个很好的解释,你可以做什么,不能用不完整的类型。
答案 1 :(得分:1)
您需要在调用构造函数之前放置类定义。理想情况下,您将它放在头文件中。
请摆脱system("pause")。
答案 2 :(得分:1)
在这个术语的任何正式含义中都没有“对类进行原型设计”的事情。
类类型可以声明(或者向前声明,因为有时会引用这种声明),这就是你所做的
class Rectangle;
声明。以这种方式声明的类类型只能以非常有限的方式使用。例如,您可以声明指向Rectangle
的指针和引用。但是你不允许访问这类类的任何内部,因为编译器对这些声明中的内容一无所知。您不能定义此类的对象。
类类型可以定义,这是您使用
所做的class Rectangle {
...
};
声明。一旦该类定义(但不是之前),您可以以任何方式使用它。
在您的代码中,您试图定义一个对象并访问已声明但尚未定义的类的成员。这不起作用,没有办法绕过它。您必须在代码中交换main
的定义和Rectangle
的定义。
如果您愿意,可以在main
(Rectangle::getHeight
等)之后定义您的会员功能,但这几乎是main
之后的所有功能。其他一切都应该在main
之前完成。