'VS 2010'에 해당되는 글 5건

다른 view를 참조하는 가장 보편적인 방법을 설명드리죠.. ^^;; 
SDI의 multi view라고 하더라도 당연히 Doc는 하나입니다. 그렇죠?? 
그럴 경우 이렇게 하시면 됩니다. 

먼저 View가 CAaaView와 CBbbView가 있고, Doc의 이름은 CPppDoc라고 합시다. 시작해 보죠.. 

먼저 CPppDoc의 헤더에 View의 포인터를 받을 포인터 객체를 선언합니다. 
CAaaView *pAaaView, *pBbbView; 

그런 다음에 Doc의 생성자에서 각각에게 NULL을 줍니다. 왜냐면 처음 생성되었을 때에는 쓰레기 값을 가지고 있으니까요.. 
CPppDoc() 

pAaaView = NULL; 
pBbbView = NULL; 


이러면 Doc에서 할 일은 끝났구요.. 다음은 각각의 View에서 할 일입니다. 각 View에서 할 일은 OnInitialUpdate에서 수행하면 됩니다. 
CAaaView::OnInitialUpdate() 

CPppDoc *pDoc = GetDocument(); //GetDocument()함수 재정의 하셨죠?? 
pDoc -> pAaaView = this; // 현재 view의 pointer를 여기에 넣어 줍니다. 



///////////////////////////////// 
CBbbView::OnInitialUpdate() 

CPppDoc *pDoc = GetDocument(); 
pDoc -> pBbbView = this; // 마찬가지구요... 


이제부터는 이녀석들을 얻어오기만 하면 되죠.. 예를들어 CAaaView에는 m_edit라는 멤버 변수가 있는데, 이 변수의 값을 CBbbView의 m_string이라는 변수에 얻어오고 싶으시면... 

CPppDoc *pDoc = GetDocument(); 
m_string = pDoc->pAaaView->m_edit; 

'VS 2010' 카테고리의 다른 글

Direct X SDK 설치시 s1023 error  (0) 2014.03.08
블로그 이미지

mind10

,

properties - c/c++ - command line


add  /D "_CRT_SECURE_NO_DEPRECATE"

'VS 2010 > Error & Warning' 카테고리의 다른 글

LNK4098  (0) 2013.03.08
블로그 이미지

mind10

,

캐스트 : 형변환

C++스타일의 캐스트는 reinterpret_cast, static_cast, const_cast, dynamic_cast 등이 있다.

 

쉽게 말해 C 스타일의 캐스트는 식별자를 그냥 괄호로 둘러 싼 그것

float a = 1.23;

int b = (int)a;

이게 바로 C스타일의 캐스트, 즉 형변환

이렇게 써놓으면 눈으로 찾기도 힘들고 내부적으로도 코드가 더러워지는 등 불편함이 있다고 합니다.

 

그런데 C++스타일의 캐스트는

static_cast<타입>(표현식)

이런식으로 작성됩니다.

 

예를들면,

int형을 double형인것 처럼 결과를 내고싶어 그렇다면 C스타일로는

int a, b;

double result = ((double) a) / b;

요런식이겠지요

 

그런데 C++스타일의 캐스트를 적용하면

double result = static_cast<double>(a) / b;

이런 스타일로 적용됩니다.

이러면 가독성이 높아집니다, 왜냐하면, static_cast 부분은 파란색으로 나오기 때문입니다,

아니 그건 그렇다쳐도 컴파일러도 내부적으로 저 부분이 인식이 더 잘된다고 합니다.

 

static_cast

기본적으로 C스타일의 캐스트와 같은 역할

그래서 double을 포인터로 바꾼다던지 int를 struct로 바꾼다던지 하는 일은 하지 못합니다.

 

const_cast

이것은 상수성(const)이나 휘발성(volatile)을 떼버리는데 사용되는 캐스트입니다.

const로 선언된 것을 제거하는데 쓰입니다

예를들면,

int update(int *a);

int b;

const & cb = b;  // cb는 b를 상수객체 인것처럼 참조합니다

update(&cb);     // 에라!! 상수라서 안돼

update(const_cast<int*>(&cb));   // 상수성을 제거해서 되는거야


 

dynamic_cast

얘는 상속계층 관계를 가로지르거나, 하향시킨 클래스 타입으로 안전하게 캐스팅 할 때 사용

기본 클래스의 객체에 대한 포인터나 참조자의 타입을 파생클래스나 형제클래스 타입으로 형 변환해주는 것

걍 예제를 보아요

class Widget {.....};                                    // 위젯 클래스

class SpecialWidget : public Widget {.....};    // 위젯의 하위클래스

void update(SpecialWidget *psw)

Widget *pw;

update(dynamic_cast<SpecialWidget*>(pw));  // 이상 없음 하위클래스의 형태로 형변환


당연한 얘기지만 dynamic_cast는 상수성을 제거하는데에는 사용될 수 없습니다

 

reinterpret_cast

얘가 정의되어 있는 코드는 컴파일러에 따라 다르게 정의되어 있기 때문에 왠만하면 쓰지 않는 편이 좋겠습니다.

함수 포인터 타입을 바꾸는데 사용되는데, 

예를들면,

typedef void (*FuncPtr)();  // 인자 안받고, void를 반환하는 함수에 대한 포인터

FuncPtr funcPtrArray[10];  // funcPtrArray는 10개의 FuncPtr로 이루어진 배열

이런 상횡에서 어쩔 수 없이 다음 함수에 대한 포인터를 넣어야할 사정이 생겼어요

int doSomething();

간단한 문제같지만 캐스트를 반드시 해 주어야 합니다.

왜냐, doSomething()은 funcPtrArray에 넣기엔 타입이 맞지 않아요

funcPtrArray는 void를 리턴하구 doSomething은 int를 리턴하니까요

funcPtrArray[0] = &doSomething;    // 걍에러 타입이 안맞습니다

funcPtrArray[0] = reinterpret_cast<FuncPtr>(&doSomething);   // 됩니다.

ㅇㅋㅇㅋㅇㅋ?

 

캐스트를 알아보았는데,

되도록이면 안쓰는걸 추천합니다

잘못된 결과가 나오기도하고, 이식성에도 좋지 않기 때문입니다.

블로그 이미지

mind10

,

Visual C++ 2010 redistributable 제거 한후 다시 설치.

'VS 2010' 카테고리의 다른 글

mfc 다중 뷰간 접근 방법  (0) 2014.08.21
블로그 이미지

mind10

,

LNK4098

VS 2010/Error & Warning 2013. 3. 8. 13:41

LINK : warning LNK4098: defaultlib "MSVCRT" conflicts with use of other libs; use /NODEFAULTLIB:library

위와같은 경고 발생시..

Properties -> Linker -> Commander Line 

 : /NODEFAULTLIB:library_name


or 


Properties -> Linker -> Input -> Ignore Specific default Libraries 

-> Ignore libraries에 Lib_name 을 삽입해준다.

'VS 2010 > Error & Warning' 카테고리의 다른 글

Warning C4996  (0) 2014.06.13
블로그 이미지

mind10

,