为什么我的班级不是原型?

时间:2013-05-12 00:35:17

标签: c++ class

#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方法下定义它?有人能告诉我我做错了什么吗?谢谢。

3 个答案:

答案 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的定义。

如果您愿意,可以在mainRectangle::getHeight等)之后定义您的会员功能,但这几乎是main之后的所有功能。其他一切都应该在main之前完成。