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;
        }
};

Compiler は、Rectangle、getHeight、および getLength が未定義であることを教えてくれます。私のクラス Rectangle がプロトタイピングされていないのはなぜですか? 誰かが私が間違っていることを教えてもらえますか? ありがとうございました。

4

3 に答える 3

2

これ:

class Rectangle;

基本的にコンパイラにそのクラスが存在することだけを伝える前方宣言です。Rectangleまた、コンパイラはこのクラスについて他に何も知らないため、Rectangle不完全な型です。

この行で:

Rectangle myRoom(5,10);

クラスは以前に定義されていませんがRectangle、クラスのインスタンスを作成しようとしています。Rectangle当然、この場合、前方宣言は十分ではありません。型Rectangleはまだ不完全です。

いつ前方宣言を使用できますか? をご覧ください。、不完全な型でできることとできないことについての素晴らしい説明があります。

于 2013-05-12T00:44:20.600 に答える
1

コンストラクターを呼び出す前に、クラス定義を配置する必要があります。理想的には、ヘッダー ファイルに配置します。

system("pause")を削除してください。

于 2013-05-12T00:39:02.823 に答える
1

この用語の正式な意味での「クラスのプロトタイピング」などはありません。

クラス型は宣言できます(または、この種の宣言が時々参照されるため、前方宣言されます)。

class Rectangle;

宣言。このように宣言されたクラス型は、非常に限られた方法でしか使用できません。Rectangleたとえば、へのポインターと参照を宣言できます。ただし、コンパイラはそのような宣言からそれらの内部について何も知らないため、そのようなクラスの内部にアクセスすることは許可されていません。そのようなクラスのオブジェクトを定義することはできません。

クラス型を定義することができます。

class Rectangle {
  ...
};

宣言。クラスが定義されると(ただし、定義前ではない)、任意の方法で使用できます。

コードで、オブジェクトを定義し、宣言されているがまだ定義されていないクラスのメンバーにアクセスしようとしています。これは機能せず、回避する方法はありません。mainコード内の の定義と の定義を交換する必要がありRectangleます。

main必要に応じて、 (など) の後にメンバー関数を定義できますRectangle::getHeightが、 の後にできることはほとんどそれだけですmain。それ以外はすべて の前に置く必要がありますmain

于 2013-05-12T00:46:04.013 に答える