'Development/C, C++, C#'에 해당되는 글 1건

반응형

CPoint, CRect, CSize 클래스는 API에서 사용하는 구조체 타입인

 POINT, RECT, SIZE 에서 파생한 클래스다.

 

클래스의 정의

 

C++ 컴파일러는 C 언어의 구조체를 클래스로 취급

예를 들어 POINT 구조체는 POINT 클래스로 간주 POINT 클래스로 파생된

CPoint 클래스는 POINT 클래스의 모든 데이터 멤버를 갖게 되므로

CPoint 객체는 POINT 객체라고 할 수 있다.

따라서 POINT 타입의 인자를 사용할 때 CPoint 객체를 대신 사용해도 상관 X

이처럼 파생 클래스 객체(CPoint)가 베이스 클래스 객체(POINT)로 간주되는 현상을

업 캐스팅(Upcasting) 이라고 함

 

업 캐스팅

void SomeFunc(RECT* rect){....}

RECT r1;

CRect r2;

SomeFunc(&r1);     // OK!

SomeFunc(&r2);     // OK! (Upcasting)

 

CPoint 객체 생성과 다루기

 

CPoint 클래스는 Long 타입의 x, y를 멤버 변수로 가짐

또 다양한 초기화 방법을 지원하고, 이 중 기본이 되고 자주 사용되는 형태는

두 개의 멤버 변수를 직접 생성자 인자로 사용하는 것

생성자

CPoint::CPoint (int x, int y);

 

생성자와 연산자 함수를 제외한 유일한 멤버 함수는 CPoint::Offset()으로 x, y에

일정한 값을 더하는 역할

연산자 종류 ( !=, ==, -, +, +=, -=)

 

예>

  CPoint pt1(10, 20);     // x, y 좌표를 생성자의 인자로 사용
  POINT pt = {30, 40}; //포인트 객체 변수 pt
  CPoint pt2(pt);   //POINT 타입의 변수를 생성자의 인자로 사용
  
  //화면에 값 출력
  cout << pt1.x << "" << pt1.y << endl;
  cout << pt2.x << "" << pt2.y << endl;

  pt1.Offset(40, 30);  //x, y 좌표에 40, 30을 각각 더한다.
  pt2.Offset(20, 10);  //x, y 좌표에 20, 10을 각각 더한다.
  
  //화면에 값 출력
  cout << pt1.x << "" << pt1.y << endl;
  cout << pt2.x << "" << pt2.y << endl;

  if(pt1 == pt2)  //두객체의 내용이 같은지 확인
   cout << "두 점의 좌표가 같습니다." << endl;
  else
   cout << "두 점의 좌표가 다릅니다." << endl;

 

 

CRect 객체 생성과 다루기

 

CRect 클래스는 LONG 타입의 left, top, right, bottom을 멤버 변수로 가짐

가장 기본이며 자주 사용되는 형태는 네 개의 멤버 변수를 직접 생성자의 인자로 사용 하는 것

 

생성자

CRect::CRect(int 1, int t, int r, int b);

 

 사각형의 폭과 높이를 곧바로 얻을 수 있도록 Width(), Height() 제공

int CRect::Width();

int CRect::Height();

 

특정 좌표가 사각형의 내부인지 외부인지 알려주는 PtInRect()

BOOL CRect::PtInRect(POINT point);

 

이밖에도 30개 이상의 함수와 연산자가 정의되어 있음

MSDN 참고해서 사용하면됨

 

예>

​  CRect rect1;
  rect1.SetRect(0, 0, 200, 100);  //사각형의 좌표를 설정
  CRect rect2(0, 0, 200, 100);  //사각형의 좌표를 생성자의 인자로 사용

  //두객체의 내용이 값은지 확인
  if(rect1 == rect2)
   cout << "두 직사각형의 좌표가 같습니다." << endl;
  else
   cout << "두 직사각형의 좌표가 다릅니다." << endl;

  RECT rect = {100, 100, 300, 200};
  CRect rect3(rect);     //RECT 타입의 변수를 생성자의 인자로 사용
  
  //사각형의 폭과 높이를 얻는다
  cout << rect3.Width() << " " << rect3.Height() << endl;

  CPoint pt(200, 150);
  
  // 해당 점이 사각형 내부에 있는지 판단
  if(rect3.PtInRect(pt))
   cout << "점이 직사각형 내부에 있습니다." << endl;
  else
   cout << "점이 직사격형 외부에 있습니다." << endl;

 

 

CSize 객체 생성과 다루기

 

CSize 클래스는 Long 타입의 cx, cy를 멤버 변수로 가짐

여러 초기화 방법을 지원 기본이며 자주 사용되는 형태는 두 개의 멤버 변수를

직접 생성자의 인자로 사용하는 것

 

생성자

CSize::CSize(int x, int y);

 

연산자

!=, +=, -=, ==, =, +

 

예>

  CSize size1(100, 200);  //폭과 높이값을 생성자 인자로 사용
  SIZE size = {100, 200};
  CSize size2(size);   //SIZE 타입의 변수를 생성자 인자로 사용
  cout << size2.cx << " " << size2.cy << endl;
  //두 객체 내용이 같은지 확인
  if(size1 == size2)
   cout << "크기가 같습니다." << endl;
  else
   cout << "크기가 다릅니다." << endl;

 

 

 

 

ps.

유틸 클래스에서 CPoint, CRect, CSize 클래스는

POINT, RECT, SIZE 클래스 파생클래스

그런데 모든 데이터 멤버를 갖고 있고

서로 같은 역할을 함 결국 파생클래스 객체가 베이스 클래스 객채로 간주 할수 있는 업캐스팅을 사용 가능

반응형
블로그 이미지

Runer

IT / 일상 / 먹방 / 꿀팁 / 유틸

,