Проблемы сборки проекта при создании статических членов.

Тема в разделе "LANGS.C", создана пользователем neutronion, 8 июн 2011.

  1. neutronion

    neutronion New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2010
    Сообщения:
    1.100
    Привет, форумчане. Решил тут наскоком немного объектно попрограммировать и столкнулся с непонятной проблемой линкера
    созал класс типа Singleton MyLogger.cpp для логгирования ошибок через
    все приложение(даю упрощенный вариант):
    Код (Text):
    1.     MyLogger.cpp
    2.  
    3. #include "StdAfx.h"
    4. #include "MyLogger.h"
    5.  
    6. MyLogger::MyLogger(void)
    7.  
    8. {
    9. }
    10.  
    11. MyLogger::~MyLogger(void)
    12. {
    13. }
    14.  
    15. MyLogger * MyLogger::instance(void)
    16. {
    17.     m_file = fopen("myfile.log","a");
    18.     return NULL;
    19. }
    20.  
    21.  
    22. MyLogger.h
    23.  
    24. #pragma once
    25.  
    26. class MyLogger
    27. {
    28. public:
    29.     MyLogger(void);
    30. public:
    31.     ~MyLogger(void);
    32. public:
    33.     static MyLogger * instance(void);
    34.     static FILE* m_file;
    35. };
    При линковке возникает такая проблема:
    Код (Text):
    1. Error   10  error LNK2019: unresolved
    2. external symbol "public: static struct _iobuf
    3.  * MyLogger::m_file"
    4. (?m_file@MyLogger@@2PAU_iobuf@@A)
    5. referenced in function "public: static class
    6. MyLogger * __cdecl MyLogger::instance(void)" (?instance@MyLogger@@SAPAV1@XZ)   
    7. MyLogger.obj
    Похоже линкер не видит этот объект, непонятно почему.
     
  2. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    540
    Статические поля надо явно инициализировать вне объявления класса и вне функций. Фактически, аналогично объявлению/инициализации глобальных переменных:
    Код (Text):
    1. FILE* MyLogger::m_file=NULL;
     
  3. neutronion

    neutronion New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2010
    Сообщения:
    1.100
    Спасибо заработало, что-то нигде в литературе не встречал такой тонкости,
    может упустил.
     
  4. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
  5. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Конечно в С++ для чайнегов такого может и нет.
     
  6. neutronion

    neutronion New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2010
    Сообщения:
    1.100
    Yeah, shit happens.