'C++'에 해당되는 글 3건

  1. 2013.06.05 [C++] 소켓 프로그래밍
  2. 2013.05.30 MFC의 구조
  3. 2013.04.15 const
posted by WizardMania 2013. 6. 5. 18:52

윈도우에 사용되는 소켓은 윈속이라 하며 사용을 위해서는 winsock2.h 파일이 인클루드 되어야한다.

#include <winsock2.h>


또한 ws2_32.lib 라이브러리를 링크 시켜야한다. 링크방법은

소스코드에 #pragma comment( lib, "ws2_32.lib ) 추가하거나, 프로젝트속성 -> 구성속성 -> 링커 -> 입력 -> 추가종속성에 

ws2_32.lib 를 적어준다.


※주의사항

winsock2.h와 windows.h를 동시에 인클루드할시 문제가 발생할 수 있다.

해결방법은 windows.h보다 winsock.h를 먼저 인클루드하면 해결이 된다.




윈속초기화


윈속 프로그래밍시 반드시 WSAStartup으로 윈속의 버전전달과 초기화 작업이 필요하다.


int WSAStartup(

  _In_   WORD wVersionRequested,
  _Out_  LPWSADATA lpWSAData
);

wVersionRequested : 초기화할 윈속의 버전 

WORD형으로 상위바이트에 부버전정보 상위바이트에 주버전 정보가 들어간다.

MAKEWORD 매크로함수를 이용하면된다. MAKEWORD( 2, 2 ) 주버전 2 부버전 2


lpWSAData : WSADATA 구조체 주소 를 전달, 함수호출후 초기화된 라이브러리의 정보가 채워짐


반환값 : 성공시0, 실패시 0이아닌 값 (에러코드)


윈속해제


윈속 사용이 끝나고 WSACleanup을 호출하여 해제를 해야한다.


int WSACleanup(void);


반환값 : 성송시0, 실패시 SOCKET_ERROR




posted by WizardMania 2013. 5. 30. 16:53

CWinApp


WIN32API에서 시작점인 WinMain 함수가 사라지고 CWinApp( 혹은 CWinAppEx )가 대신한다.


프로젝트명.cpp에 CWinApp를 상속하는 클래스가 작성되어있다

또한 전역객체가 선언되어있는 것을 확인할수 있다.


CWinApp클래스는 응용프로그램 자체를 의미하는 클래스라 할 수 있다.


프로그램의 시작과 종료, 메인 프레임 윈도우 생성, 메세지 루프등 윈도우 응용프로그램에 있어야될 기본적인 동작들을 하도록 해준다.


기본적인 멤버함수

InitInstance() : 프로그램 시작 시점에 호출된다.

ExitInstance() : 프로그램 종료 시점에 호출된다.

Run() : 메시지 루프


InitInstance 는 기본코드에서 재정의되어 사용되고 있으며 다른함수들은 추가적인 기능이 필요할 경우 재정의를 하면된다. 


CFrameWnd


최상위 프레임 윈도우에 해당하는 클래스.

윈도우의 크기,위치,상태 등의 조절.

메뉴,툴바,상태바등을 생성.


CDocument


문서와 관련된 처리를 하는 클래스.








posted by WizardMania 2013. 4. 15. 10:09

일반적으로 const는 해당 변수를 상수화 한다고한다. (값의 변경 불가)

하지만 쓰이는 곳에따라 의미가 조금씩 다르다고 할 수 있다.




기본자료형 변수 에서의 const


const int num = 10;

num 변수는 상수화 되어 다른값의 대입이 불가능 하다.

num = 20; 같은 대입이 불가능하다. (값을 가져와 쓰는것만 가능하다.)


변수 생성과 동시에 값이 초기화 되어야한다.


const int num;           // 불가능 초기화값이 존재하지 않는다.

const int num = 20;    // 가능 초기화값이 존재한다.




포인터 에서의 const


const가 포인터 앞에붙냐 뒤에붙냐에 따라 나뉘게 된다.


const int* pNum = &num;

pNum 변수를 참조해서 값의변경이 불가능 하다.

*pNum = 10; 불가

num변수를이용하여 값을 변경 하는것은 가능하다.

num = 10; 가능


int* const pNum = &num;

포인터 변수 pNum에 다른 주소값으로 변경이 불가능 하다.

pNum  = &num2; 불가

pNum 변수를 참조해서 값의 변경은 가능

*pNum = 20; 가능


물론 위의 두개를 동시에 사용할 수 도 있다. (위두가지 특성을 모두 가지게 된다)

const int* const pNum = &num;




예제 클래스

class SimpleClass
{
public:
	int num1;
	int num2;

	SimpleClass()
		: num1( 0 ), num2( 0 )
	{
	}

	int Function1()
	{
		num1 += 10;
		return num1;
	}

	int Function2() const
	{
		// 이함수 내에서 멤버변수의 변경 불가
		return num2;
	}
};

const 멤버함수


class의 const 멤버함수는 함수내에서 멤버변수의 값이 변경되는것을 막는다.

또한 외부에서 멤버변수의 변경가능성이 존재하는 포인터, 레퍼런스로 리턴하는것도 불가능 하다. 

함수이름 뒤쪽에 const를 붙여준다.


int Function2() const 

{

return num2;

}


다음과 같은 멤버변수 변경이 불가능 하다.

int Function2() const 

{

num2 += 10;    // 불가능

return num2;

}


객체에서의 const


const 객체는 멤버변수 값의 변경이 불가능하며 const 멤버 함수만 호출 가능 하다.


const SimpleClass* simple1 = new SimpleClass;

simple1->Function1()  // 불가능

simple1->Function2()  // 가능

simple1->num1 = 10;   // 불가능




mutable


해당멤버 변수는 const멤버함수 내에서의 값의 변경이 허용된다.

멤버변수 num2 가 mutable int num2; 으로 선언되어있다면  불가능 했던 아래코드가 가능하다.

int Function2() const 

{

num2 += 10;    // 가능

return num2;

}


const 함수가 무의미해질 수 있기 때문에 특별한 경우가 아니라면 사용을 안하는 것이 좋다.




const_cast


c++에서 추가된 형변환 연산자이다.


포인터와 참조자의 const를 제거 하는 목적으로 사용된다.

const 를 사용하게되면 위에서봤던 제약조건들이 생기게된다.

유일하게 const_cast로 const 성향을 없애줄 수 있다.


const SimpleClass* simple1 = new SimpleClass;

SimpleClass* simple2 = const_cast<SimpleClass*>(simple1);    // const가 제거된다

simple2->Function1();    // const가 제거되었기 때문에 const멤버함수가 아닌 함수도 호출가능

simple2->num1 = 5;        // const가 제거되었기 때문에 public 멤버 변경가능


무분별한 사용은 const를 무의미하게 하기때문에 특별한 용도로만 쓰는 것이 좋다.




const의 중요성