dynamic_cast

Posted 2012. 8. 13. 22:09

C++의 대표적인 형변환 두가지중 하나.(나머지 하나는 static_cast)

 

들어가기 앞서..

일반적인 형변환은뭐..

int a = 3;

float b;

b = (float)a;

printf(.... 3.000~~~~~) 뭐 이렇게 바꾸는겅..

 

dynamic_cast(동적 형변환)를 알아보자.

  1. 상속관계 안에서 포인터나 참조의 타입을 기본클래스에서 파생클래스로 다운캐스팅을 할 수 있다.
  2. 다중상속에서 기본클래스간의 캐스팅을 지원한다
  3. 다형성과 관계있기 때문에 virtual함수가 하나 이상 있어야 된다.

 

 업캐스팅을 하는 이유와 사용은

부모클래스 a = new 자식클래스();

이렇게 업캐스팅하면 부모클래스에 포함된 것만 사용 할 수 있다.

 

업 캐스팅으로 인해 서브 클래스를 가리키는 참조변수를 다운 캐스팅해서 인스턴스와 참조변수의 클래스형을 동일학 ㅔ하는것에 한해서만

다운 캐스팅을 허용한다.

즉.. 업 캐스팅된 레퍼런스 변수를 다운 캐스팅한 것은 문제가 안되지만, 인스턴스가 부모 클래스로 선언되어 있는 상태에서 다운 캐스팅을 할 경우

예외 사항을 발생시킨다.

 

사용점.

상속 관계에 놓여있는 두 클래스 사이에서 유도 클래스의 포인터 및 참조형 데이터를 기초 클래스의

포인터 및 참조형 데이터로 변환 할 경우에 쓰인다.

 

static_cast 는 반대의 경우에 사용됨.

 

dynamic_cast는 실행 시간에 안정성을 검사 하도록 컴파일러가 바이너리 코드를 작성하는 반면

static_cast 는 강제형변환이라 안정성이 보장 되지 않음.

그래서 dynamic_cast 는 static_cast에 비해 속도가 느리다.

 

CString 형변환

Posted 2012. 8. 13. 22:08

CString -> BYTE

BYTE* temp;

CString cmd;

cmd값을 temp에 할당할때

 

1)

temp = new BYTE[256];

temp = (LPBYTE)(LPCSTR)cmd;

delete []temp;

 

또는..

2)

strcpy(szNamePlace, (LPCTSTR)name);

 

또는

3)

CString str = "string";

BYTE* pByte;

pByte = (BYTE*)(LPSTR)(LPCTSTR)str;

BYTE -> CString

CString String;

BYTE byte;

String.Format("%s", byte);

 

int -> CString

#define_AFXDLL
#include<afxwin.h>//cstring 사용위한...
voidmain()
{

CStringstr;

inti=6;

str.Format(L"%d",i);

printf("%s \n",str);
}

BYTE -> int ,   int -> BYTE

바로 형변환 가능.

bt = (BYTE)i;//단.. 바이트는 255이하의 값만 들어감 ^^, 그이상 들어가면 엉뚱한 값이나옴..

i = (int)bt;

 

CString -> char*

유니코드기반

(char*)(const wchar_t*)str

 

char* -> CString

str = (LPCSTR)(LPSTR)ch;

 

LPSTR은 char*임.

LPSTR : char sring의 32비트 포인터, char* 와 같다

LPCTSTR : constant character string의 32비트 포인터

uint : 32비트 unsigned형 정수

dword : unsigned long int 형

byte : 8비트 unsigned 정수

 

간단한 파일 입출력

Posted 2012. 8. 13. 22:04

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void main()
{
     int state; //error 체크변수
     char* pState;
     char str[20];

     // 일기전용 파일개방
     FILE* pfile = fopen("log.txt", "rt");

if(pfile == NULL){
  printf("file open error\n");
 }

 //fscanf함수활용
 while(1){
  pState = fgets(str, sizeof(str), pfile);
  if(pState == NULL)
   break;
  fputs(str, stdout); 
 }
 //파일종결
 state = fclose(pfile);
 if(state != 0){
  printf("파일닫기실패\n");
 }
}

 

« PREV : 1 : ··· : 74 : 75 : 76 : 77 : NEXT »