2013-05-12 2 views
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 메소드에서 정의 할 수 있습니까? 누군가 내가 뭘 잘못하고 있다고 말할 수 있습니까? 고맙습니다.수업이 프로토 타입 화되지 않는 이유는 무엇입니까?

+0

먼저, 헤더 파일에 Rectangle 클래스를 넣습니다. 둘째, 절대로 시스템을 사용하지 마십시오 ("일시 중지") 좋은 습관/습관이 아닙니다. 당신이 틀린 곳은 main() 후에 클래스를 선언했기 때문일 것입니다. 포함 후에는 맨 위에 놓아 라. –

답변

1

생성자를 호출하기 전에 클래스 정의를 넣어야합니다. 이상적으로는 헤더 파일에 넣는 것이 좋습니다.

system("pause")을 제거하십시오.

2

이 :

class Rectangle; 

는 기본적으로 Rectangle가 존재하는 클래스하지만 컴파일러 아무것도 알 수없는 앞으로 선언입니다. 그리고 컴파일러는이 클래스에 대해 다른 것을 알지 못하므로 은 유형이 불완전합니다입니다. 이 라인에서

:

Rectangle myRoom(5,10); 

당신이 클래스 Rectangle가 이전에 정의되지 않은 있지만 클래스 Rectangle의 인스턴스를 만들기 위해 노력하고 있습니다. 물론,이 경우에는 전방 선언으로 충분하지 않습니다. 유형 Rectangle은 여전히 ​​불완전합니다.

When can I use a forward declaration?을 살펴보면 불완전한 유형으로 할 수있는 일과 할 수없는 일에 대한 멋진 설명을 찾을 수 있습니다.

1

용어의 공식적인 의미에서 "클래스를 프로토 타이핑하는"것과 같은 것은 없습니다.

클래스 타입이 될 수 선언 (또는 선언의이 종류는 때때로 언급 한, 앞으로 선언) 당신이 당신의

class Rectangle; 

선언에 의해 한 일이다. 이런 방식으로 선언 된 클래스 유형은 매우 제한된 방식으로 만 사용할 수 있습니다. 예를 들어 Rectangle에 대한 포인터와 참조를 선언 할 수 있습니다. 그러나 컴파일러는 그러한 선언으로부터 그러한 내부자에 대해 아무 것도 알지 못하기 때문에 그러한 클래스의 내부에 액세스 할 수 없습니다. 이러한 클래스의 객체를 정의 할 수 없습니다.

클래스 타입은 당신이 당신의

class Rectangle { 
    ... 
}; 

선언 한 일이다,을 정의 할 수 있습니다. 클래스가 으로 정의 된 후에는 (이전에는 아니지만) 원하는대로 사용할 수 있습니다.

코드에서 객체를 정의하고 선언되었지만 아직 정의되지 않은 클래스의 멤버에 액세스하려고합니다. 이 방법은 효과가 없으며 주변에는 방법이 없습니다. 코드에서 main의 정의와 Rectangle의 정의를 바꿔야합니다.

원한다면 main (Rectangle::getHeight 등) 뒤에 회원 기능을 정의 할 수 있습니다. 그러나 이것은 main 이후에 할 수있는 거의 모든 것입니다. 다른 모든 것은 main 전에 가야합니다.