xylosper's notebook

검색 :
RSS 구독 : 글 / 댓글 / 트랙백 / 글+트랙백

Qt에 대하여 - 13. 실전! - 텍스트 에디터(4) : 디자이너로 메인윈도우 만들기

2009/09/08 09:42, 글쓴이 xylosper
디자이너를 이용하면 메인윈도우도 간단히 만들수 있습니다.
특히 많은 메뉴들과 툴바아이콘들을 배치해야 할 경우 보면서 할수있기에 편리합니다.

디자이너로 메인윈도우를 만들려면, 디자이너를 실행시키고 메인윈도우를 선택합니다.

메인 윈도우 만들기


메인윈도우를 생성하고 나면 메뉴바 위치에 Type Here 라는 문구가 보입니다. 여기서부터 메뉴와 액션들을 추가해 갈수 있습니다.

참고로 여기서부터는 메뉴와 각종 텍스트는 영어로 작성하도록 하겠습니다.
이유는 기본 언어를 영어로 하고, 번역판으로 한국어를 제공하는 방식으로 하기 위해서 입니다.
물론 기본 언어를 한국어로 해도 되고, 국내이용자만을 대상으로 하는 경우라면 그걸로도 충분 할 것입니다.
이에 따른 차이는 나중에 또 별도로 설명하겠습니다.

한번 파일 메뉴와 새 파일 액션을 추가해보세요. Type Here 라는 곳을 더블 클릭하여 &File 이라고 입력한 후 엔터를 누르면 파일 메뉴가 생성됩니다.
이상태에서 파일 메뉴를 클릭하면 메뉴창이 열리고 그 아래에는 또 Type Here 이라는 문구와, Add Seperator 라는 문구가 보입니다.
Type Here를 더블 클릭하고 메뉴를 생성할 때와 같은 요령으로 &New File 이라고 입력하면 새 파일 액션이 생성됩니다.
그런데 새 파일 액션의 오랜쪽에 + 같은 모양의 아이콘이 보일 것입니다.
이 아이콘은 액션을 메뉴로 확장하는 아이콘으로, 하위 메뉴를 만들 때 이용합니다.

메뉴와 액션의 문자열을 고치고 싶을 때는 메뉴상에서 더블 클릭하여 고치면되며, 그외의 속성들을 수정할 때는, 다른 위젯들과 동일하게 Object Inspector와 Property Editor를 이용하여 수정할 수 있습니다.
또한, 액션의 경우 액션만을 위한 Action Editor 라는 것이 제공됩니다.
Action Editor는 디자이너의 기본 레이아웃이라면 오른쪽 하단의 Signal/Slot Editor와 겹쳐져 있으니, Action Editor 탭을 눌러서 표시할 수 있습니다.

Action Editor

Action Editor를 보면 방금 만든 새 파일 액션이 보입니다.
한번 더블 클릭해보면, Edit Action이라는 다이얼로그가 나타납니다.
이 다이얼로그는 Property Editor에서 특히 액션의 경우 자주 편집되는 부분만 모아 놓은 것이라고 생각하면 됩니다.
ToolTip외에는 별도로 항목에 대한 설명은 필요 없어 보입니다.

우선 아이콘을 지정해봅시다.
이전과 마찬가지로 로컬 파일을이용할 수 도 있고, Qt의 리소스를 이용할 수도 있습니다.
Qt의 리소스를 이용하는 경우, 디자이너를 이용하여 리소스를 쉽게 관리할 수 있습니다.
여기서는 Qt 리소스를 이용하는 법도 배울 겸, 리소스를 이용하여 아이콘을 지정해보겠습니다.
Icon 항목의 오른쪽의 ... 버튼을 클릭해보면 Select Resource 다이얼로그가 나타납니다.
하지만 현재 불러온 리소스 파일이 없기 때문에 아무것도 선택할 수 없습니다.
여기서 상단의 연필 모양 버튼을 클릭하면 Edit Resources 다이얼로그가 나타납니다.
이 창의 하단을 보면 왼쪽에 두개의 버튼이 활성화되있는데요, 왼쪽은 새로운 리소스 파일(.qrc)파일을 만드는 버튼이고, 오른쪽은 기존의 리소스 파일을 여는 버튼입니다.

이전에 만들었던 리소스 파일을 열어 보면 이전에 넣어 둔 아이콘 파일이 하나 표시될 것입니다.
여기서는 연습 삼아 새로운 리소스 파일을 만들어 보겠습니다.
열린 리소스 파일을, 왼쪽의 X 버튼으로 닫고, 새 리소스 파일을 만듭니다.
여기서는 이전에 만든 resources.qrc 파일에 덮어 씌우겠씁니다.
이제 오른쪽 버튼들이 활성화 됩니다.
우선 + 버튼을 눌러서 prefix를 추가합니다.
prefix는 리소스에 접근 할때의 최상위 경로로 보통은 / 로 하면됩니다.
그후 오른쪽에서 두번째 버튼으로 리소스를 엽니다.
이전에 첨부한 소스 파일을 보면, img 디렉토리 안에 두개의 이미지 파일이 있습니다.
두개 모두 선택하여 추가 한후 OK 버튼을 누르면 리소스 파일이 편집되어 저장됩니다.
참고로 리소스를 삭제할 때는 제일 오른쪽의 - 버튼을 이용하면 됩니다.
또, 리소스는 Action Editor의 오른쪽 탭에 있는 Resource Browser를 통해서도 열람/편집이 가능합니다.

다시 Select Resource 창으로 돌아왔습니다,
이제 방금 추가한 두개의 이미지를 선택할 수 있습니다.
적당한 이미지를 선택한 후, OK를 누르면 아이콘이 선택된 것을 확인 할 수 있습니다.

그외에 Object name은 원하는 이름으로(저는 newFileAction)으로 입력하시고, Shortcut으로 단축키를지정합니다(저는 Ctrl+N).
단축키는 오른쪽의 화살표 버튼을 클릭한후 실제로 키보드로 원하는 단축키를 누르면 자동으로 입력됩니다.

이것으로 액션편집이 끝났습니다.
이번에는 툴바를 만들어 보겠습니다.
메인 윈도우의 적당히 가운데에서 오른쪽 클릭을 해보면 Add Tool Bar라는 메뉴가 제일 상단에 나타납니다.
이 메뉴를 선택하면 메뉴바 밑에 가느다란 툴바가 추가 됩니다.
툴바가 가느다란 이유는 아직 아무것도 안들어 있기 때문입니다.
여기에 방금 만든 새파일 메뉴를 추가해보겠습니다.
Action Editor에서 추가할 액션을 드래그 하여 툴바에 드랍하면 됩니다.

마지막으로 메인 윈도우의 central widget을 지정해봅시다.
정확히 말하면, 디자이너에서 만든 메인윈도우의 경우 central widget은 무조건 평범한 QWidget이 들어가게됩니다.
그대신 디자이너에서는 그 위젯 안에 다른 위젯을 넣어서 표시할 수가 있습니다.
우리는 텍스트 에디터를 만들고 있으므로 왼쪽에서 Text Edit 위젯을 가져오서 메인 윈도우의 가운데에 놓고, Object Name을 edit로 지정합니다.
그후 방금 내려놓은 Text Edit 외의 적당히 다른 부분을 클릭하면 상단의 레이아웃 툴바가 활성화됩니다.
이상태에서 적당한 레이아웃(여기서는 다른 위젯을 배치하지는 않으므로 아무거나 상관없습니다).
여기서 레이아웃을 지정해야 하는 이유는 자동으로 크기가 조절되도록 하기 위해서 입니다.
저는 Lay Out Horizontally 를 선택하였습니다.
그런데 이상태로는 Text Edit 상하좌우로 여백이 들어가 버립니다.
이 여백은, 레이아웃을 넣은 위젯의 property에서 없앨 수가 있습니다.
Object Inspector에서 방금 레이아웃을 넣은 위젯(아마도 특별히 수정하지 않았으면 centralwidget이라고 되어있는 위젯)을 선택한 후, Property Editor의 가장 아래쪽을 보면 Layout 이라는 항목이 보일 것입니다.
여기서 LayoutLeftMargin, LayoutRightMargin, LayoutTopMargin, LayoutBottomMargin을 0으로 입력해주면 Text Edit 주변의 여백이 없어질 것입니다.

마지막으로 메인윈도우의 프로퍼티에서 윈도우 아이콘으로 리소스의 document-edit.png 파일을 선택해주고, 윈도우 타이틀도 적당히 적어줍시다(저는 Text Editor라고 해주었습니다).
이상태에서 Ctrl+R을 눌러 미리보기를 해봅시다.
겉모습만 보면 이전에 만든 texteditor 프로그램과 동일 할 것입니다.
이 상태에서 한번 툴바의 버튼에 마우스 커서를 올려놓고 가만히 둬보세요.
New File이라는 작은 텍스트가 표시됩니다.
이것이 아까 설명하지 않고 지나간 액션의 ToolTip입니다.
기본적으로는 액션의 Text가 그대로 표시되지만, ToolTip을 적당히 수정하여 원하는 텍스트가 표시되게 할 수도 있습니다.

여기서 작성한 파일을 mainwindow.ui라는 이름으로 저장한 후, 실제 코드에서 불러와서 적용합니다.
우선 새로운 ui파일을 만들었으므로 프로필 파일(texteditor.pro)에 다음과 같이 FORMS 항목을 추가해줍니다.

FORMS += mainwindow.ui

그리고 mainwindow.cpp를 대대적으로 수정해줍니다.

[code]#include "mainwindow.h"
#include "ui_mainwindow.h"

struct MainWindow::Data {
    Ui::MainWindow ui;
};

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), d(new Data) {
    d->ui.setupUi(this);
   
    connect(d->ui.newFileAction, SIGNAL(triggered()), this, SLOT(newFile()));
}

MainWindow::~MainWindow() {
    delete d;
}

void MainWindow::newFile() {
    d->ui.edit->clear();
}
[/code]
기본적인 요령은 이전에 설명한 폼 디자인 적용하기와 마찬가지로, setupUi() 함수를 호출 하여 줍니다.
이전 소스와 비교해보면 아시겠지만 메인 윈도우에서 메뉴바나 툴바를 생성하는 과정이 디자이너를 이용함으로서 생략되어 훨씬 간략한 소스가 되었습니다.
그리고 액션이나 Text Edit는 이제 Ui::MainWindow의 멤버이기 때문에 d->edit 등은 d->ui.edit 등으로 수정해주었습니다.

마지막으로 소스파일을첨부하고 디자이너를 이용한 메인윈도우 만들기를 마칩니다.
첨부한 소스파일에는, 이외에도 별도의 설명없이 간단히 구현할 수 있는 몇가지 메뉴가 더 추가되어있습니다.
소스코드를 보시고 이해가 안되시면 질문해주세요.

texteditor.tar.gz

예제 소스코드


2009/09/08 09:42 2009/09/08 09:42

맨 위로

Qt에 대하여 - 12. 실전! - 텍스트 에디터(3) : 리소스

2009/04/15 19:17, 글쓴이 xylosper
실제로 어플리케이션을 만들다보면, 모든 것이 소스코드만으로 해결되지 않는 경우가 많습니다.
그 대표적인 예가 어플리케이션에서 이용하는 아이콘들입니다.
이번 회에서는 어플리케이션과 액션에 아이콘을 적용해보고, Qt의 리소스에 대해서 알아보겠습니다.
texteditor.tar.gz

예제 파일

이번회에서는 mainwindow.cpp에 다음 두줄을 생성자의 마지막에 추가합니다.
[code]
...
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), d(new Data) {
...
    setWindowIcon(QIcon("img/document-edit.png"));
    d->newFileAction->setIcon(QIcon(":/img/document-new.png"));
}
[/code]
그리고 소스코드와 같은 위치에 다음과 같은 내용의 resources.qrc 파일을 작성합니다.
[code]
<RCC>
    <qresource prefix="/" >
        <file>img/document-new.png</file>
    </qresource>
</RCC>
[/code]
마지막으로 texteditor.pro파일에 다음 한줄을 추가합니다.
[code]
RESOURCES += resources.qrc
[/code]
먼저 mainwindow.cpp의 추가된 라인을 살펴보겠습니다. setWindowIcon()이라는 함수가 호출되고 있는데, 이것은 QWidget::setWindowIcon()으로, 모든 위젯이 가지고 있는 함수입니다.
이를 이용하여 해당 위젯이 최상위 위젯일때 표시되는 아이콘을 지정할 수 있습니다.
이 함수는 QIcon의 객체를 인자로 받는데, QIcon은 딱 보면 알수 있듯이 아이콘에 대한 클래스입니다.
가장 간단한 사용방법은, 위와 같이 QIcon(이미지파일 경로)와 같이 생성하는 것입니다.
이미지 경로가 img/document-edit.png로 되어있는데, 이것은 작업경로에 대한 상대경로로, 당연히 절대경로도 가능합니다.

첨부된 예제소스를 받아보면, 소스코드가 있는곳에 img라는 디렉토리가 추가되어있고 그 안에 이미지 파일이 들어있는 것을 확인 할수 있습니다. 현재는 소스코드가 있는 곳에서 빌드하고 실행하기 때문에, 이 경로로 이미지의 위치를 제대로 인식하지만, 만약 실행파일이 다른 곳으로 옮겨지는등 작업경로가 변경되면 이미지를 인식 할 수 없게됩니다.
또한 실제 배포시에는 이미지를 각 시스템에 맞게 별도로 제공해야 할 수도 있습니다.
그럼 절대 경로를 이용하면 되지 않느냐? 라고 생각 할수도 있겠지만, 이경우는 배포시의 경로를 강제해야 하고, 이것은 합리적이지 못합니다.

이럴 때, '리소스'를 이용할 수 있습니다.
Qt의 리소스 시스템이란, 바이너리 파일을 실행파일에 포함시켜버리는 것을 말합니다.
즉, 애시당초 이미지를 별도로 다루지 않고, 실행파일에 붙여버리는 것입니다.
이러면 배포할때 이미지 경로를 신경쓰지 않아도 될 뿐만 아니라, 실행파일과 이미지를 함께 배포해야 하는 수고를 덜수 있습니다.

리소스로 이용하고 싶은 파일들은 위에 적은 resources.qrc파일처럼 형식에 맞게 목록을 작성하여 qrc의 확장자로 목록을 저장한후, texteditor.pro파일 처럼 프로필 파일에 'RESOURCES += 리소스 목록 파일'과 같이 리소스 목록 파일을 지정해주어야 합니다.
qrc파일의 형식은 매우 간단하므로 별도 설명은 하지 않습니다. 좀더 다양한 활용법에 대해서는 assistant를 참고하시기 바랍니다.

생성자에 추가된 마지막 줄은 이 리소스 파일로부터 아이콘을 만들고 있는 코드입니다.
QIcon의 생성자로 넘긴 이미지 파일의 경로를 보면 :/ 로 시작하고 있습니다. :/로 시작하는 경로는 리소스 파일에 대한 경로입니다. 이와 같이 리소스로 추가된 파일을, 실제 소스코드내에서 불러올때는 반드시 :로 시작하는 경로를 입력해야 합니다. /는 리소스 목록 파일에서 prefix로 지정된 경로로, 만약 prefix="/rsc"와 같이 지정했었다면 :/img/document-new.png가 아니라 :/rsc/img/document-new.png 와 같이 해야 할 것입니다.
QAction::setIcon()함수는 해당 액션에 아이콘을 지정하는 함수입니다. 액션의 아이콘은, 다음과 같은 역할을 합니다.
1. 툴바에 표시된 액션의 아이콘
2. 메뉴에 표시된 액션의 아이콘

이리하여 실행해보면 두가지 아이콘이 적용된 모습을 볼 수 있습니다.
실행화면

실행화면

이번회에서는 리소스의 예로 이미지 파일을 들었지만, 그외에도 여러가지 활용법이 있습니다.
예를 들면 소스코드에 직접 적어 넣기 힘든 문서내용을, 텍스트파일로 저장하여 불러올수 있습니다.
혹은 특정 동작에 대한 소리를 리소스로 집어 넣을 수도 있습니다.
2009/04/15 19:17 2009/04/15 19:17

맨 위로

CMPlayer 0.3.0 릴리즈

2009/04/10 06:36, 글쓴이 xylosper
CMPlayer 0.3.0버전을 릴리즈하였습니다.
0.2.5이후부터 재생 엔진을 통합하여 CMPlayer는 현재 '다양한 재생엔진을 지원하는 엔드 유저를 위한 리눅스용 멀티미디어 플레이어'라는 컨셉으로 개발하고 있습니다.

CMPlayer 0.3.0

CMPlayer 0.3.0

다음 페이지에서 다운로드 할 수 있습니다.
http://kldp.net/frs/?group_id=1243

CMPlayer로는 다음과 같은 것들이 가능합니다.

* 다양한 재생엔진의 지원(현재 MPlayer와 xine 이용가능, 차후 GStreamer 지원 예정)
* 파일/URL/DVD 재생 지원
* DVD 메뉴 지원(xine only)
* 화면 크기/종횡비 설정 및 잘라내기 지원
* 스냅샷 지원
* 재생 속도 변경 가능
* 복수의 오디오 스트림을 포함한 미디어 지원
* 파일명으로부터 재생목록 자동 생성
* 단일 어플리케이션 지원
* 시스템 트레이 아이콘 지원
* 최소화 및 복귀시 자동 일시정지 및 자동 재생 시작
* 재생중 화면 보호기 끄기
* 구간 반복 기능
* 상하단 여백 존재시 자동으로 자막 출력위치가 조절됨
* Sami(smi), SubRip(srt), MicroDVD, TMPlayer 자막 포맷 지원
* 통합 자막지원
* 포맷에 상관없이 복수의 자막들의 동시 표시 가능
* 자막 인코딩 자동 탐지(libchardet 이용)
* SAMI포맷의 컬러 자막 지원(xine only)
* 전 메뉴 단축키 설정 가능
* 마우스 조작으로 동작 설정 가능

이외에도 여러가지 편리한 기능이 포함되어있습니다.
2009/04/10 06:36 2009/04/10 06:36

맨 위로

Xy LaTeX Editor - 텍스트큐브용 LaTeX 편집기 플러그인

2009/02/27 21:56, 글쓴이 xylosper
Hybrid님이 만드신 SitmoLaTeX Display를 보고, 플러그인을 한번 열어보니, 고정된 주소로 렌더링해주는 거라면 뭐든지 가능하겠다 싶어서 CodeCogs의 LaTeX Equation Editor를 이용하여 Xy LaTeX Editor라는 이름으로 텍스트큐브용 LaTeX편집기 플러그인을 만들었습니다.

이 플러그인은 LaTeX 수식을 표시해줄 뿐만 아니라, 글을 작성하고 편집할때 수식의 미리보기와 수식 입력을 도와주는 툴바를 제공합니다.

플러그인을 설치하면 다음과 같이 글 작성창 하단에 두개의 버튼이 생깁니다.
사용자 삽입 이미지
  1. 새 수식 삽입하기
    본문에 새 수식을 삽입하기 위해 수식 에디터를 엽니다.
  2. 선택된 수식 고치기
    본문에서 선택된 수식을 고치기 위해 수식 에디터를 엽니다.
어느 버튼을 누르던 다음과 같은 수식 에디터 창이 열립니다.
사용자 삽입 이미지
버튼에 따른 차이는, 새 수식 삽입하기 버튼은 아무것도 입력되지 않은 창을 띄우고, 선택된 수식 고치리 버튼은 선택된 수식의 내용이 미리 입력되어있다는 점입니다.

적당히 편집후 확인 버튼을 누르면, 새 수식 삽입되거나 수정될 수식이 갱신됩니다.
사용자 삽입 이미지
참고로 글 작성시에 보이는 것은 어디까지나 '미리보기'입니다. 실제로는 수식내용이 그대로 저장되고, 나중에 다시 글을표시할때 이미지로 치환됩니다.

또한 본문에 직접 [tex*]...[tex*](실제론 tex*가 아니라 tex)사이에 수식을 입력해도 실제로 표시될때 이미지로 치환됩니다.

몇가지 설정가능한 부분이 있는데, 그중 다음 두가지는 약간의 설명이 필요할듯 하여 소개합니다.
  1. 자동업데이트 시간
    위에서 설명한 수식 입력후 자동으로 이미지를 갱신해주기 까지의 시간 간격을 밀리초단위로 설정합니다. 0보다 작은 수가 입력되면 자동업데이트기능을 끕니다.
  2. 본문 렌더링 여부
    렌더링 설정부분에서 '글 표시할 때'라는 부분이 있는데, 이부분을 체크해제하면 Xy LaTeX Editor의 미리보기 및 편집기 기능만을 이용하게됩니다. 본문의 수식을 실제로 표시하는 것은 다른 방법을 이용하고 싶은 경우에 체크를 해제하면 됩니다.
마지막으로 사이드바에 CodeCogs 배너를 추가할 수 있는 기능이 있습니다.
플러그인을 적용하면 사이드바 위젯에 CodeCogs배너가 선택가능해집니다.
Xy LaTeX Editor의 수식 렌더링은 전부 CodeCogs에 의해서 생성된 것이며, 실제 이미지또한 CodeCogs에 의해서 제공됩니다.
CodeCogs는 이미지를 제공하는 대신, 다음과 같은 배너를 웹사이트에 달아줄것을 '부탁'하고 있습니다.
CodeCogs - An Open Source Numerical Library
어디까지나 부탁이므로 이를 따를 의무는 없습니다만, 도리로서 되도록이면 본 플러그인을 이용하시는 분들은 (특히 글 표시할때에도 이 플러그인을 이용하시는 경우에는) 사이드바에 배너를 추가해주길 저도 '부탁'드립니다.
실제로 배너가 달린 모습은 제 블로그의 사이드바에서 볼수 있습니다.

한가지 주의사항이 있는데요, 글 표시할때 렌더링을 CodeCogs로 하는 경우, 과다하게 이미지를 가져다 쓰는 경우 블록될수 있다고 경고하고 있습니다. 일일 10,000번이상의 이미지 요청이 예상될경우는 따로 연락을 달라고 합니다. 자세한 것은 CodeCogs홈페이지의 LaTeX Editor Usage Policy를 참고해주세요.
XyLaTeXEditor.tar.gz

Xy LaTeX Editor 다운로드

마지막으로 LaTeX 글이면서 수식이 하나도 없기에, 테스트도 겸해서 몇가지 식을 끄적이고 마칩니다.

\left\{-\frac{\hbar^2}{2m}\nabla^2+V(\vec{r}, t)\right\}\psi(\vec{r}, t) = ih \frac{\partial}{\partial t}\psi(\vec{r},t)
\oint \vec{H}\cdot d\vec{r} = \int \left(\vec{i} + \frac{\partial \vec{D}}{\partial t} \right)\cdot d\vec{S}

u(x,y,z) = -\frac{i}{\lambda}\frac{e^{ikz}}{z} \iint u_0(x_0,y_0)e^{\frac{ik}{2z}\left\{(x-x_0)^2 + (y-y_0)^2\right\}}dx_0dy_0

\begin{align*} E &= \int _0 ^{\infty} f_B(\omega)\hbar \omega D(\omega) d\omega \simeq \frac{3V\hbar}{2\pi^2 v^3}\int_0^{\omega_D} \frac{\omega^3}{e^{\beta \hbar \omega}-1}d\omega \\ C_V &=\frac{\partial E}{\partial T} = 9Nk_B\left(\frac{T}{\Theta}\right)^3\int_0^{\Theta /T}\frac{x^4e^x}{(e^x - 1)^2}dx \\ &\simeq\left\{\begin{matrix} 3Nk_B & (T \gg \Theta)\\ \frac{12}{5}\pi^4Nk_B\left(\frac{T}{\Theta}\right)^3 \propto T^3 & (T \ll \Theta) \end{matrix}\right. \end{align*}
2009/02/27 21:56 2009/02/27 21:56

맨 위로

static 변수를 이용한 싱글톤 구현시 주의할 점

2008/09/17 16:28, 글쓴이 xylosper
어제 하루 종일 낑낑대던 문제가 있었습니다.
싱글톤(singleton)을 이용한 객체를 가져다 쓰는 부분에서 자꾸 segmentation fault가 발생하는 것입니다.

싱글톤의 구현 자체는 다음과 같이 C++에서 극히 일반적인 static변수를이용한 구현입니다.

class Singleton {
public:
    static Singleton *get() {static Singleton self; return &self;}
private:
    Singleton() {}
};

싱글톤 자체는 공유라이브러리에 들어있고, 이것을 서로 다른 두 바이너리에서 동시에 가져다 쓰는 형태인데요, 딱히 서로 다른 쓰레드에서 가져다 쓰는 것도 아니기 때문에, 멀티쓰레딩 환경에서의 static변수로 인한 문제도 없을 것이라 생각하여 별 신경 안썼었습니다.

그런데 이부분에 죽어대니 도대체 원인을 알수 없더군요...

그러던중 구글링 하다가 다음과 같은 글을 발견하였습니다.

function static 스타일의 Singleton 버그?

결론은, Singleton::get()함수가 인라이닝되는 바람에, 싱글톤이 싱글톤이 아니게 된 것이었습니다.

Singleton::get()함수의 구현을 cpp파일로 뺐더니 잘 돌아가네요-_-;

오늘의 교훈: static변수를 이용한 싱글톤 구현은 반드시 해더파일과 분리하자!
2008/09/17 16:28 2008/09/17 16:28

맨 위로