#include <cstdlib>
#include <iostream>

using namespace std;

class ancestor {
};

template <class T> class grandParents : public ancestor {
public:
    void print(void)
    {
        T *pT = (T *)this;
        pT->printChild();
    }
};

class parents : public grandParents<parents> {
public:
    virtual void printChild(void) { cout << "Parents" << endl; }
};

class children : public parents {
public:
    int num;

    children(void) { num = 1; }
    void printChild(void) { cout << "Children " << num << endl; }
};

int main(void)
{
    ancestor *p = new parents;
    delete p;

    parents y;
    y.print();

    children x;
    x.print();

    system("pause");
    return 0;
}

ancestor 클래스를 넣은 이유는 모종의 의도가 따로 있어서이지만, 여튼 나는 조부모라는 클래스를 만들고 부모라는 클래스를 mix-in을 통해 상속 구현했다. 조부모의 print()를 통해 호출되는 printChild에 대해 나는 기능 추가가 필요하다고 생각했다. 그리고 전반적으로 부모 클래스를 그대로 사용할 필요가 있으면서도 확장된 클래스가 필요하다고 여겨졌다. 즉 부모 클래스를 상속하면서 조부모의 print()에 의해 호출될 printChild() 내용도 바꾸고 싶다는 건데 어떤 방법이 있을까?

임시방편으로 부모의 printChild() 함수를 가상함수로 해봤다. 나쁘지 않아보이지만 mix-in의 의미가 퇴색하지 않을까? mix-in은 일단은 가상함수 테이블을 줄이기 위해 나온 기법이라고 알고 있는데......

한편 부모에 다시 템플릿 인자를 줘서 (가령 template <class T> class parents : public grandParents<T> { ... 의 식으로) 해볼 생각도 있었지만 이건 부모 클래스 자체를 못 쓰게 되니까......

꽤 미묘한 문제다. 가령 내가 UI 프레임 클래스를 하나 짰다고 치고 나중에 기능확장을 한다 치면, 가장 먼저 상속을 떠올릴 텐데 mix-in의 경우에는 그게 또 미묘한 것 같다. 그렇다고 저게 꼭 큰 비용을 지불하는 건 아니지만.

분류없음 l 2009/06/16 08:18

2009. 6. 15

devpaks.org는 08년 말 들어 거의 망해가는 추세이긴 하지만 여튼 건질만한 라이브러리는 많으므로 상당히 도움이 되는 사이트이긴 하다. 그런데 devpaks.org의 유일한 다이렉트 X 자료였던 Direct X SDK 9.0c가 이젠 다운로드 되지 않는다. 이유는 업로더인 G-Production이 데이터를 업로드 한게 아니라 그쪽 링크를 단 것이기 때문. G-Production에서 링크를 삭제한 모양이다.
걱정하지 마라. 펌질은 업뎃보다 빠르니까.
http://www.dgrigoriadis.net/post/2004/06/26/DirectXDevPak-for-Dev-Cpp.aspx
여기 다 있다.



2009. 6. 3

생각보다 잔머리를 굴린 WTL 아니 ATL. http://scarletblue.net/78에서 보시다시피 WTL을 하려면 ATL이 있어야 한다. ATL에는 atlwin.h라는 중요한 헤더가 있으므로 이 포스트는 굉장히 유용했다.
자, 잠깐 말머리를 돌려볼까? http://jacking75.cafe24.com/WTL/56.htm에서 보면 WTL 아니 ATL은 이런 문법도 지원하는 모양이다.

전략...
CUpDownCtrl m_updown_r;
중략...
m_updown_r = GetDlgItem(IDC_SPIN_R);
후략...

자, MFC에서는 GetDlgItem()이 CWnd * 형태로 반환한다. 따라서 ATL 역시 해당 클래스의 포인터로 반환할 것이고 저건 오퍼레이터에 의해 복사연산자라도 발동하겠지. 물론 클래스 포인터의 형변환이라던가가 생략되어 있지만 어차피 아마도 클래스에 멤버라고는 m_hWnd밖에 없을 테니 저런 표기라도 가능할 거라 생각했던 내가 바보였다. 다음은 atlwin.h의 CWindow 클래스 코드의 일부이다.

CWindow& operator=(HWND hWnd)
{
    m_hWnd = hWnd;
    return *this;
}

HWND GetDlgItem(int nID) const
{
    ATLASSERT(::IsWindow(m_hWnd));
    return ::GetDlgItem(m_hWnd, nID);
}

뭣......?!
그래도 저건 저거대로 나쁘지 않은 방법이라고 할 수도 있다. 근데 그렇다고 하더라도 저 코드는 MFC의 GetDlgItem()을 따라갈 수는 없다고 생각한다.
하긴, 처음부터 이상하긴 했다. 랄까 MFC가 너무 반칙이다. 어떻게 모달 다이얼로그의 자식 컨트롤조차 CWnd * 포인터를 가질 수 있지? 물론 나도 꼼수는 있다고 보지만, 그 꼼수는 상당한 오버 헤드를 가지게 될 것임에 틀림없다. 오히려 ATL쪽이 더 현실적일 정도다. 도대체 어떻게 돼 먹은 MFC인가...... orz

MFC의 어태칭은 CHandleMap이라는 해쉬에 의해 이뤄진다고 한다. 피로토스 형님, 디- 형님 감사합니다. 꾸벅.


9. 6. 1

확실히 나는 코딩 경험이 굉장히 떨어진다. 다음의 코드를 보고 꽤나 신기할 정도였으니까.
class CMessageFilter
{
public:
    virtual BOOL PreTranslateMessage(MSG* pMsg) = 0;
};
위 코드는 WTL 8.0에서 발췌한 코드. 당연히 말이 되는 코드지만 꽤나 신기했다.



2009. 5. 20

으아! 무슨 격월 일기인가! 이 포스트는!

여튼 glutBitmapCharacter() 함수는 glBegin() 함수와 glEnd() 함수 사이에서 작동하지 않음. 그리고 적어도 gcc의 sprintf 함수의 %lf 옵션은 long double을 인식을 못하는 것 같음. 좀 더 자세한 확인이 필요할 것 같지만 내게는 시간이 ㅇ벗음! 레포트 달려야댐!


2009. 4. 27

생각해 보니, 블로그를 그간 안 한 이유는 이번학기 컴퓨터 수업이 거의 없기 때문! 정말로 3월말부터 프로그래밍을 한 적이 없구나...... 라고 하는 것은 오늘은 프로그래밍을 하고 있다는 것.



2009. 4. 2

내 게으름을 용인할 정도로 과제가 적게 너오지 않는다.



2009. 3. 22

몸이 좋지 않다. 편도선이 부었다. 물이라도 많이 마셔야지.



2009. 3. 20

요즘 이녀석을 쓰지 않고 있다. 딱히 안적으려는 건 아니고. 미묘하게 시간이 ㅇ벗다. 하지만 나는 요즘 멍하게 딴짓을 장시간 하는 성향이 있다. 라고 하는 건 정신줄을 놨다는 건지도 모르지.



2009. 3. 17

나는 Dev-C++에서 벗어나는 것을 생각하는 것을 그만두었다.

http://www.winapi.co.kr/project/library/wtl/1-2.htm
WTL의 mix in에 대해 한가지 정도의 실험을 해봤는데 실로 신묘하다. 라이브러리를 완성하면 mix in을 적용시킨 것도 만들어봐야겠다. 즉 부모 클래스에서 템플릿으로 전달된 자식의 클래스형을 통해 this 포인터를 캐스팅하여 자식의 함수를 부르더라도 아무 하자도 없다. 왜냐면 this 포인터는 부모 클래스로 만들어진 인스턴스가 아닌 자식 클래스로 만들어진 인스턴스를 가리킬 테니까. 이 무슨 실로 절묘한 트릭이란 말인가. 게다가 이건 오히려 어떤 의미에서 상속에 의한 오버라이딩보다 더 유연하며 성능은 빠르면 빨랐지 느릴 일은 없는 것이다.



2009. 3. 15

수식에 대한 물리적 의미의 이해는 굉장히 중요하다고 생각한다. 가장 힘든 부분이기도 하지만. 몇일 전 까지만 해도 나는 언더댐핑이 왜 일어나는가? 라고 물으면 전혀 대답할 수 없었을 것이다. 지금도 제대로 대답할 수 없기는 매한가지이지만.



2009. 3. 12

한글의 수식 편집기 스크립트는 상당히 직관적이고 괜찮은 것 같다. 기호를 표현하는 몇개의 구문 빼고는...... 요 몇년간 마소 워드로 작업해 온 탓에 이번만큼 수식 편집기를 많이 쓴 적은 없었고 스크립트로 작업한 게 아니라 버튼을 눌러 작업을 했었는데, 이번에는 분량이 많아 스크립트로 작업했더니 왠걸? 상당히 편하다. 몇가지만 주의하면 버튼을 눌러서 하는 것 보다 속도도 느리지 않고.



2009. 3. 10

2학년 복습을 하는데 아주 그냥 죽겠음. 회로는 페이져만 믿고 가고 싶은...... 여튼 그럭저럭 과제를 끝내긴 했는데 애매하네요.

임피던스의 크기가 저항 R만 남는 공진 주파수 ω0 = 1 / root(LC), 퀄리티 팩터 Q = ω0L / R = (1 / R) root(L / C), 전달함수 H = Out / In, I'' + p I' + q I = 0 에서 두 해가 a, b일 때 a, b가 모두 실근이라면 I = K1 e^at + K2 e^bt, 모두 허근이고 a = α + βi, b = α - βi이라면 I = (e^(α * t)(A1 cos (β * t) + A2 sin (β * t)) 복잡다.



2009. 3. 9

뭐야? 생각해 보니 오픈소스 툴에 대한 포스트가 3개는 넘는 것 같다. 카테고리를 만들어 버릴까...... 는 제쳐두고 선미방을 풀어야 하는데 야밤에 이러고 있......

비손실 음원 압축 중 대표적인 예가 flac와 ape들인데 사실 이것 말고도 TTA나 TAK 같은 녀석들이 있는데 성능은 이쪽이 후자인 만큼 조금 더 뛰어날 지도 모르겠지만 그렇다고 해서 딱히 포멧이 늘어나는 것이 크게 좋아 보이지만은 않는다. 몇년이 지나야 대부분의 소프트나 포터블 플레이어에서 TTA나 TAK를 지원해줄까? 압축을 풀어서 다시 재압축 하는 작업을 하고 있으려니......



2009. 3. 7

이야, MS에 한방 먹었다. ^^ 굉장히 복잡한 방법으로 어떤 '편의성'을 구현하고 있었는데, MS의 클래스 구조를 보고 나는 말 그대로 한방 먹었다. 나는 거기서 그 '편의성'의 절반을 내다 버리는 것으로  나머지 절반을 매우 깔끔하게 짤 수 있다는 사실을 알게 되었다. 게다가 그 '편의성'의 절반을 내다 버린 코드가 오히려 '편의성'을 강조한 코드보다 훨씬 깔끔하다는 사실을 알게 되었다. 2월부터 고수하고 있었던 코드가 한순간에 바뀌니 뭐랄까......

파괴자에 윈도우 핸들을 파기하는 코드를 넣어 놨는데, 생각해 보니 문제가 될 여지가 있다. 역시나 선견지명의 MS는 MFC에서 'delete를 쓰지 말고 DestroyWindow를 호출하시오.' 라고 권하고 있다.

생각해 보니 이런 식으로 일기(?)를 쓴 지 한달이 넘었군?



2009. 3. 6

http://msdn.microsoft.com/en-us/library/ms644924(VS.85).aspx
If the hWndMDIClient parameter is NULL, the return value is the same as for the DefWindowProc function. 즉 DefFrameProc 함수는 hWndMDIClient 인자가 널이면 DefWindowProc 함수랑 똑같은 값을 리턴한다는 것. 즉 MDI 클라이언트 컨트롤의 윈도우 핸들이 있던 없던 DefFrameProc로 리턴해줘도 별 문제 없다는 이야기.



2009. 3. 4

딱히 copy & paste로 올려둔 코드는 아니고 나름 공을 들였다고 생각한 코드였는데 어딘가 틀려먹은 부분이 보이면 좀 그렇다. 내가 참고하고자 올리긴 했지만서도...... 미숙하다.

지금까지 짜 왔던 소스 하나를 완전히 분해하고 있다. 물론 크게 잘못되어서 분해하는 건 아니다. 소스를 짤 때 있어서 어떤 기준을 세웠으나 그 기준이 현실적이지 않다고 '결단'했기 때문이다. 판단과 결단은 조금 다른 문제인 것 같다. 가령 상반된 두 결정이 모두 옳다고 할 때 필요한 건 판단이 아니라 결단이다. 그렇다고 그 결단이란 게 딱히 좋은 것 만도 아닌 것 같다. 그 결과로 나는 지금 상당히 짜증나 있다.



2009. 3. 3

드디어 아기다리고기다리던 사운드 카드가 왔다. 내 메인보드는 서드 파티 제품으로 마우스가 돌거나 하드가 돌거나 하면 화이트 노이즈가 팍팍 튀는데 그런 일이 완전히 사라져서 굉장히 좋다. 성능 부분도 약간 향상된 느낌. 이 부분에 대해서는 특히 FPS 따위로 시험을 해 봐야겠지만 지금의 내 컴퓨터로 그건 절대 무리고.

라는 내용으로 모 커뮤니티에 글을 올렸더니 다른 분께서 말씀하시길 컴퓨터 사셨다고. ㅠㅜ
나도 안선생님께 외치고 싶다. "안선생님, 컴퓨터가 사고 싶어요!"



2009. 3. 1

개강이라니?! 아니, 내일 개강이라니?! 이게 무슨 소리야?! 이건 말도 안돼. 말도 안된다구!

어제는 고수하던 컴퓨터 케이스의 덮개를 열어서 치워놓았다. 확실히 파워랑 팬의 소음의 주파수가 많이 떨어졌다. 그만큼 덜 돈다는 소리겠지...... 문제는 덮개를 열어놓은 만큼 소음의 크기가 증가했다...... 어?! 여튼 하는 김에 선도 정리. 덮개 방향이 책상 서랍과 붙어 있어 컴퓨터 위치를 바꾸는 김에. 지금까지 책상도 높고 마우스 선 문제도 있고 해서 "Oh, my shoulder!" 를 외치곤 했는데, 그나마 덜 해진 정도. 이어폰 연장선도 모니터 뒤로 둘러서 이전보다 깔끔해졌다.

이미 알고 있지만 뭔가 만들어야만 할 것이 필요하다. 주제나 아이템이 없는 코드는 거기서 끝날 뿐이다.



2009. 2. 28

목표는 명확하다. List-View, Tree-View, HDC, HBITMAP 등을 중심으로 클래스 래핑하고 나머지 하지 못한 컨트롤들을 래핑한다. 인데...... 어찌 하면 할 수록 난관에 봉착한다. 특히 맨 앞에 두 녀석은...... 싫을 정도다.



2009. 2. 27

원래의 목적은 내 귀를 보호할 수 있도록 나쁘지 않은 '스피커'를 사는 것이었다. 스피커에 이어폰을 끼우면 도저히 듣기 힘들 정도로 노이즈가 섞여 있기 때문에. 근데 생각해 보니 이 문제는 이어폰 연장선을 사서 이어폰을 스피커에 연결하지 않고 메인보드에 연결하는것 만으로 해결된다. 실제로 샀고. 하지만 나는 어째서인지 '사운드 카드'를 사게 되어 버린 것이다. 주문도 했다. 물론 메인보드 칩셋에도 미약한 노이즈가 섞여 있어서 사운드 카드가 있어도 괜찮을 정도이긴 하다. 문제는 내 분체에 그놈이 들어가느냐 하는 것이다...... 엥?!
예상 리플 : 아니, 그럼 크기도 안보고 그냥 질렀단 말야?



2009. 2. 26

http://www.tipssoft.com/bulletin/board.php?bo_table=FAQ&wr_id=2
『명시된 이름은 이 함수를 호출한 프로세스의 주소공간에 연결된 각 모듈의 이름과 비교되어진다. 만약 lpModuleName 포인터의 값으로 NULL을 사용했다면 이 함수를 호출한 프로세스의 핸들값이 반환될 것이다. 즉, GetModuleHandle(NULL); 이라고 호출한 것은 AfxGetInstanceHandle(); 함수를 호출한것과 동일한 값을 반환한다.』

http://www.tipssoft.com/bulletin/board.php?bo_table=FAQ&wr_id=326
DC에 다른 장치 지원 없이 그라데이션을 뿌릴 수 있는 방법. 이걸로 나도 간지나는 커스텀 컨트롤을 만들 수...... 있고 없고 그 이전에 귀찮......

전역 변수는 반드시 ::을 붙이는데 매크로는? 사실 크게 신경 쓸 필요가 없는 문제지만 매크로는 가끔씩 양날의 검이 되곤 한다.
#define add(p,q) ((p) + (q))
c = ::add(a, b); // c = ::((p) + (q));
// expected id-expression before '(' token
?!?!?!

http://www.yesusa.org/faqs12.html
'A by which B' 는 A를 사용하므로써 B가 일어난다. 고 해석해도 되나? 아오, 영어공부좀 할걸.



2009. 2. 22

C 스타일의 캐스팅은 무지막지하기 때문에 C++에서는 거의 비추천이라지만, dynamic_cast의 문제점을 생각해 볼 때 좋은 것은 다중 상속과 다운 캐스팅의 배제다. 윈도우 핸들을 클래스 래핑하는 입장에서 보자면 위에 대한 대책은...... 컨트롤 ID를 잘 챙기자는 정도일까......
특히 하나의 부모 윈도우에 ID가 겹치는 자식이 존재해서는 안된다. 그래야만 그나마라도 ID를 이용해서 원형에 대한 클래스의 캐스팅을 할 수 있을 테니까.

http://www.catch22.net/tuts
Win32 Tips, Tricks and Tutorials - No MFC, No VB, pure Win32 C/C++ !!!
Win32에 대한 팁이 굉장히 많다.



2009. 2. 21

확실히 폰을 바꾼 건 잘 한 일이긴 하다. 이전 폰 배터리는 지속시간이 너무 짧다.

오, 오늘만은 어쩔 수 ㅇ벗다! 돈도 없지만 그래도 할 수 ㅇ벗다! 야식을 먹는 수 밖에!



2009. 2. 20

DefFrameProc(HWND, HWND, UINT, WPARAM, LPARAM) 이녀석을 난 이해할 수 없다. 어차피 앞에 오는 윈도우 핸들은 뒤에 오는 윈도우 핸들의 부모일 텐데 왜 굳이 인자로 받고 난리냐?



2009. 2. 19

아침, 점심 모두 굶었더니 배가 고파 미칠 지경.

을 밥 두그릇 + 제육볶음으로 해결하고 왔습니다. 이제 든든 ^^



2009. 2. 18

뭘 쓸려고 했는데 까먹었다. 잠이 와서 그런가? 여튼 오늘 다 하려던 작업은 내일...... 이 아니고 점심으로 옮겨지게 되었다. 여튼 작업이 다이얼로그에 접근하면서부터 점점 어셈블리 코드로 된 딜리게이터가 더욱 절실히 느껴진다. 그러나 나는 어셈을 못하므로 그 방법은 취하지 못하지만 여튼 다른 방법을 강구하긴 했는데 몇번의 테스트가 필요한 건 사실이다.



2009. 2. 17

수강신청아, 승부다!

bma 정모 성과 : 부루마블

집에 가면 진짜 코딩좀 해야지 ㄱ- 이젠 시간이 ㅇ벗다!



2009. 2. 14

발렌타인데이bma 정모다. 잠을 자야 내일 안 늦을 텐데 코딩을 한답시고 아직 안자고 있다. 더 큰 문제는 코딩을 거의 안하고 있다는 것이다.

올라오니 VS가 없다. 근데 클박으로 뭔가를 받고 있다. VS는 깔면 리붓해야 된다. 아오 빡쳐.

생각해 보니 정모가 10시였다. 큰일났다. 여튼 아침부터 일어나서 한다는 일이 VS 인스톨. 클박은 컴이 재부팅 됐는지 덜받아 놨더라. 아오 ㅠㅜ



2009. 2. 13

서울 도착. VS 깔아야겠군.



2009. 2. 11

지금 하고 있던 프로젝트 파일의 인텔리센스 파일 용량 : 15mb
코드 라인 : 천줄 미만, 코드 용량 : 20kb 미만
결론 : 흠좀무

하나 막히니까 다 막힌다. 하긴 처음부터 그렇게 짠게 잘못이긴 했다. 좀 석연찮은 코드였음. 그래도 그렇지...... 이거 하나 다 바꾸면 지금까지 짠 상속 클래스도 다 바꿔야댐 ㄲㄲㄲㄲㄲㄲ



2009. 2. 10

포스트의 등록일 갱신은 상당히 편한 것 같다. 덕분에 글을 갱신하는 것 만으로 알아서 맨 위로 올라가서 마치 공지같은 효과가 난다. 좋군?

VS 2008 EE를 쓰고 있는데 EE에 설치되어 있는 인텔리센스만으로 완전 대박이다. 올라가서도 VS 2008 EE를 깔아 써야겠다. 인텔리센스는 굉장히 편하다.

클래스 랩핑으로 노선을 바꾼 후 느끼는 건 속도가 굉장히 빨라졌다는 것이다. 매크로 래핑에 비해서 디자인을 크게 고려할 필요가 없을 정도로 쭉쭉 나간다. (물론 아닌 것도 있지만.)



2009. 2. 9

rw32ad 매크로에 비해 사용자가 작성해야 할 코드 량이 미친듯이 길어졌다. 게다가 더 싫은 건 스타일이 마치 자바의 awt나 swing처럼 되어간다는 것이다.

작업하던 다른 클래스 하나를 결국 통째로 날렸다. 어차피 MFC 대용으로 만드는 거라 차라리 MFC를 참고하는 게 나을 수도 있겠다.



2009. 2. 6

그간 개발하던 rw32ad 매크로는 매크로의 한계가 아닌 win32 api의 구조적 한계 때문에 잠깐 접어둔다. 대신 매크로 래핑이 아닌 클래스 래핑을 하고 있다. 클래스 랩핑은 확실히 매크로 래핑보다 상당히 유연하고 확장성, 재활용성에서 좀 더 나은 면이 있는 것 같다. 하지만 종래의 래핑 클래스들과는 다른 노선을 타다 보니 문제가 이래저래 발생하긴 한다. 그래도 재미는 있다. 매크로 래핑때는 빡빡했던 코딩 스타일이 클래스 래핑으로 넘어오면서 여유 넘치게 되었다. 모양새도 이전보다 차라리 매끈하다.

ETC l 2009/06/15 17:39

http://eufonius.tistory.com/entry/stl-vector-erase-사용시의-주의점-외 에서 vector의 erase는 실행되면 이터레이터를 자동으로 다음 칸으로 옮겨주기 때문에 실행한 후에는 이터레이터에 ++를 붙이지 않는다는 것을 근거로 list에서 똑같이 했더니 계속 에러. 라는 것은 무언가 잘못되었다는 것이겠지.

실제로 list에서의 erase는 이터레이터를 자동으로 다음 노드로 보내주지 않기 때문에 사용자가 ++을 하던 --를 하던 둘 중 하나는 해 줘야 한다. 해 주지 않는 이상 그 상태의 이터레이터는 유효하지 않기 때문에 그대로 사용했다가는 뻗는다.

이것 말고 어떤 일정한 조건이 있을 때 노드를 쉽게 삭제할 수 있는 remove_if라는 명령이 있다. 리스트의 모든 원소를 일정 조건으로 검사해 삭제할 때는 이 명령이 훨씬 편한 것 같긴 하다.

Programming/C/C++ l 2009/05/07 07:59
1 2 3 4 5  ... 20 

카테고리

분류 전체보기 (59)
ETC (12)
Tools (6)
Programming (40)

달력

«   2009/07   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
get rsstistory! Tistory Tistory 가입하기!