[잡담] c++ 공부 산 넘어 산이군요.

emptynote의 이미지

c++ 공부 산 넘어 산이군요.

class CommonWidget {
private :
static int ttmp;
public :
static Gtk::ComboBox* CreateForgotQuestComboBox() {
LOGGER_DEBUG("start");
ttmp = 10;
Gtk::ComboBox* p_forogot_quest_combo_box = new Gtk::ComboBox();
LOGGER_DEBUG("end");
return p_forogot_quest_combo_box;
}
};

이런식으로 만들었는데, undefined reference to `CommonWidget::ttmp' 라고 뜨는군요.

static 멤버변수와 멤버 메소드를 사용한 1개 파일로된 예제 보면 참 쉬운데,

막상 파일로 나누면서 가니깐 링크 에러가 콜록...

c++ static 노이로제 걸리겠네요.

그래서 찾아보니 이런 에러가 나는 경우가 대략 2가지네요.

1) 참고 url : http://ubuntuforums.org/showthread.php?t=532693
2) 참고 url : http://www.zemy.net/tc/zemyblue/113

다행히 제 경우는 1)번 인듯하네요.

이글 쓰는 중에 해법을 찾아서 다행입니다.

rexos33의 이미지

너무 당연한 것이 이제 막 시작하는 사람들에게는 어려움이군요...
새삼 개구리 올챙이적 생각을 못한다는 사실을 깨닫게 되네요. ^_^

추가로 몇가지 조언하자면...
어떤 프로젝트를 하던 몇가지 시작하기전에 정해야하는 룰들이 있습니다.
코드 네이밍 컨벤션 룰 그리고 코딩 스타일 룰, 기본 타입 정의 (이식성을 위해서라도 해야 함), namespace 룰, 디버깅 출력 제어(trace/printf 들의 출력 물) 등은 혼자하던 여럿이 하던 정하고 시작하는 것이 좋아욤.
이건 짧은 프로젝트를 할 때는 귀찮은 것들이지만, 이런 사소한 것들 조차 귀찮아 해서는 훌륭한 소프트웨어 개발자가 되긴 어렵다 생각됩니다.

암튼 열심히 공부하셔서 훌륭한 개발자가 되어 주세요. ^_^

  1. ----------------- Type.h -----------------
  2. #ifndef _KLDP_TYPE_H
  3. #define _KLDP_TYPE_H
  4. ////////////////////////////////////////////////////////////////
  5.  
  6. #include <climits>
  7.  
  8. namespace Kldp {
  9.  
  10. #ifndef _KLDP_STD_TYPES
  11. #define _KLDP_STD_TYPES
  12. //////////////////////////////////////////////
  13. typedef signed char int8;
  14. typedef unsigned char uint8;
  15. typedef signed short int16;
  16. typedef unsigned short uint16;
  17. typedef signed int int32;
  18. typedef unsigned int uint32;
  19. #if defined(_WIN32)
  20. typedef signed __int64 int64;
  21. typedef unsigned __int64 uint64;
  22. #elif defined(__linux__) || defined(__APPLE__) || defined(ANDROID)
  23. typedef signed long long int64;
  24. typedef unsigned long long uint64;
  25. #endif
  26. ///////////////////////////////////////////////
  27. #endif // _KLDP_STD_TYPES
  28.  
  29. {... 생략 ...}
  30.  
  31. } // end of KLDP
  32.  
  33. {... 생략 ...}
  34.  
  35. #endif // _KLDP_TYPE_H
  36.  
  37.  
  38. // [EOF]
  39.  
  40. ----------------- CommonWidget.h -----------------
  41. #ifndef COMMON_WIDGET_H
  42. #define COMMON_WIDGET_H
  43.  
  44. {... 생략 ...}
  45.  
  46. class CommonWidget {
  47. {... 생략 ...}
  48. private :
  49. static int32 s_ttmp; // 네이밍 룰 #1: 클래스 멤버 변수인 경우... "s_"를 붙이도록 하고, 그냥 일반 객체 멤버 번수라면 "_"만 붙이도록 한다. 그러나 ttmp 라는 멤버 변수 이름 자체는 좋지 못한 것임....
  50. public :
  51. static Gtk::ComboBox* createForgotQuestComboBox();
  52. {... 생략 ...}
  53. };
  54.  
  55. {... 생략 ...}
  56.  
  57. #endif // COMMON_WIDGET_H
  58.  
  59.  
  60. // [EOF]
  61.  
  62. ---------------- CommonWidget.cpp ----------------
  63. {... 생략 ...}
  64.  
  65. int32 CommonWidget::s_ttmp = 0; // 클래스 멤버 변수 s_ttmp를 0으로 초기화 한다. 가급적 개발자는 초기 상태를 제어해야 합니다.
  66.  
  67. {... 생략 ...}
  68.  
  69. Gtk::ComboBox* CommonWidget::createForgotQuestComboBox()
  70. {
  71. LOGGER_DEBUG("start");
  72. s_ttmp = 10; // 숫치값 10의 의미가 가변적이지 않고 고정 상태를 나타낸다면 상수 선언 또는 정의 해서 사용하는 것이 좋습니다.
  73. Gtk::ComboBox* comboBox = new Gtk::ComboBox();
  74. LOGGER_DEBUG("end");
  75.  
  76. return comboBox;
  77. }
  78.  
  79. {... 생략 ...}
  80.  
  81.  
  82. // [EOF]

모두들 행복하세요~

emptynote의 이미지

좋은 지적 감사합니다.

ttmp는 잊어주세요. 혹시나 int 형 변수도 에러가 나는가 해서 급하게 정한 변수명입니다.

서버/클라이언트 구조의 간단한 게임을 하나 만들려고 하는데,

"기본 타입 정의 (이식성을 위해서라도 해야 함)" 로 알려주신

typedef signed char int8; 등은 정말 유용하게 잘 사용하겠습니다. ^^

나머지것들은 천천히 공부해 나가겠습니다.

좋은 하루 되세요.