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

4

3 回答 3

2

这个:

class Rectangle;

是一个前向声明,基本上只告诉编译器该类Rectangle存在。而且由于编译器对此类一无所知,Rectangle因此是不完整的类型

在这一行:

Rectangle myRoom(5,10);

您正在尝试创建类的实例,Rectangle尽管该类Rectangle之前尚未定义。当然,在这种情况下,前向声明是不够的。类型Rectangle仍然不完整。

看看我什么时候可以使用前向声明?,您会发现对不完整类型可以做什么和不能做什么的很好的解释。

于 2013-05-12T00:44:20.600 回答
1

在该术语的任何正式含义中,都没有“为类设计原型”这样的东西。

可以声明类类型(或前向声明,因为有时会提到这种声明),这就是您的

class Rectangle;

宣言。以这种方式声明的类类型只能以非常有限的方式使用。例如,您可以声明指向 的指针和引用Rectangle。但是你不能访问此类的任何内部结构,因为编译器对此类声明中的这些内部结构一无所知。您不能定义此类的对象。

可以定义类类型,这就是您对您的

class Rectangle {
  ...
};

宣言。一旦定义了类(但不是之前),您可以以任何您希望的方式使用它。

在您的代码中,您试图定义一个对象并访问已声明但尚未定义的类的成员。这是行不通的,也没有办法解决。您必须交换代码中的定义main和定义Rectangle

如果您愿意,您可以在main(Rectangle::getHeight等) 之后定义您的成员函数,但这几乎是您在 之后所能做的main。其他一切都应该先行main

于 2013-05-12T00:46:04.013 回答
1

您需要在调用构造函数之前放置类定义。理想情况下,您会将其放在头文件中。

请摆脱系统(“暂停”)

于 2013-05-12T00:39:02.823 回答