분류 전체보기 (308) 썸네일형 리스트형 [C++] 멤버 포인터 변수, 연산자 멤버 포인터 변수는 특정 클래스에 속한 멤버만을 가리키는 포인터이다. 타입 클래스::*이름; class MyClass { public: int i,j; double d; }; void main() { MyClass C; int MyClass::*pi; double MyClass::*pd; int num; pi=&MyClass::i; pi=&MyClass::j; pd=&MyClass::d; //pd=&MyClass::i; //pi=&MyClass::d; //pi=# } 위 코드 처럼 선언한 클래스와 타입에 대해서만 대입이 허용된다. 대입을 할 때에는 &Class::Member 형식으로 대입한다. 멤버포인터 변수로 객체의 멤버를 액세스 할때는 멤버 포인터 연산자를 이용한다. Obj.*mp pObj->.. [C++] 캐스트 연산자 (static, dynamic, const, reinterpret) 기본적으로 우리가 사용하는 캐스트 연산자는 강제로 타입을 바꾸기 때문에 위험하다. 예를 들어 문자형 포인터 변수를 정수형 포인터로 캐스팅했을 때 알 수 없는 엉뚱한 번지를 가리킨다. 그래서 좀 더 안전하고 목적에 맞게 쓸 수 있는 캐스트 연산자들이 있다. static_cast(대상) static_cast는 논리적으로 변환 가능한 타입만 변환한다. 예를 들어 실수형를 정수형으로 변환하거나 double과 float의 변환 등은 가능하지만 포인터 타입을 변환하는 것은 상속 관계일 떄만 허용한다. void main() { Parent P,*pP; Child C,*pC; int i=1; pP=static_cast(&C); // 가능 pC=static_cast(&P); // 가능하지만 위험 pP=static_cas.. [C++] RTTI void func(Parent *p){ p->PrintMe(); ((Child *)p)->PrintNum();} void main(){ Parent p; Child c(5); func(&c); func(&p);} 위 코드에서 Parent 클래스와 Parent의 파생클래스 Child 클래스에만 함수 PrintNum()이 존재한다고 하자. 그렇다면 func의 인수로 Child클래스가 들어가면 상관없지만 Parent클래스가 들어가면 Child 클래스로 강제로 캐스팅되고 Parent클래스에는 PrintNum이 없기 때문에 오류가 발생한다. 그래서 func의 인수의 타입을 실시간으로 알수 있게 하는 C++의 기능이 RTTI이다. RTTI는 클래스의 타입정보가 v.. [C++] 예외 객체 class Exception { private: int ErrorCode; public: Exception(int ae) : ErrorCode(ae) { } int GetErrorCode() { return ErrorCode; } void ReportError() { switch (ErrorCode) { case 1: puts("메모리가 부족합니다."); break; case 2: puts("연산 범위를 초과했습니다."); break; case 3: puts("하드 디스크가 가득 찼습니다."); break; } } }; void Calc() { // 메모리 할당 후 연산해서 파일로 출력하는 동작을 한다고 하자. if (TRUE/*에러 발생*/) throw Exception(1); // 여기까지 왔으면 무.. [C++] 예외 처리 예외 처리는 위와 같이 진행된다. try 블럭 내에서 throw로 예외를 던지면 그 타입에 따른 catch 문으로 이동한다. class C { int a; public: C() { puts("생성자 호출"); } ~C() { puts("파괴자 호출"); } }; void divide(int a, int d) { if (d == 0) throw "0으로는 나눌 수 없습니다."; printf("나누기 결과 = %d입니다.\n",a/d); } void calc(int t,const char *m) { C c; divide(10,0); } void main() { try { calc(1,"계산"); } catch(const char *message) { puts(message); } puts("프로그램이 종료됩.. [C++] 클래스 템플릿 클래스에 대한 템플릿인 클래스 템플릿도 존재하는데, 형태는 위와 같고 타입에 따라 달라지는 부분만 T를 사용한다. 클래스 템플릿에 의해 클래스가 만들어질때마다 클래스 크기만큼의 용량이 역시 증가한다. template class PosValue { private: int x,y; T value; public: PosValue(int ax, int ay, T av) : x(ax),y(ay),value(av) { } void OutValue(); }; 클래스 템플릿의 생성자에는 를 사용하지 않는다. template void PosValue::OutValue() { gotoxy(x,y); cout =0 ? ar[n]:0); } }; 템플릿의 인수로 타입이 아닌 상수를 전달할 수 있다. 이것을 비타입 인수라고 한.. [C++] 함수 템플릿 함수 템플릿은 함수를 만들어내는 형틀이며 이 형틀에서 만들어진 함수를 템플릿 함수라고 하고, 그 과정을 구체화라고 한다. 구체화 될 때마다 구체화된 타입의 함수가 늘어나고 용량이 증가한다. template T cast(int s) { return (T)s; } template void func(void) { T v; cin >> v; cout [C++] 순수 가상 함수 class Graphic { public: virtual void Draw()=0; }; 위 코드는 순수 가상함수의 형식이다. 순수 가상 함수를 가지고 있는 클래스는 추상 클래스라고 한다. 추상 클래스의 파생 클래스들은 순수 가상 함수가 선택이 아닌 필수로 가지고 있어야 한다. 한글과 워드는 차이점이 있지만 ReadTable, ReadPicture 같이 공통적으로 갖고 있는 기능을 모두 순수 가상 함수로 정의한다. 그러면 ParseHwp 와 ParseDoc 클래스는 모두 순수 가상 함수를 필수로 가져야 한다. 그리고 Parser 클래스는 실제로 어떤 것을 구현하는 것이 아닌 양쪽 클래스의 공통된 기능을 가지고 있는 추상 클래스이다. 이전 1 ··· 30 31 32 33 34 35 36 ··· 39 다음