2014-01-06 4 views
0

Я работаю на классе даты обертку в C++C++ скопировать STRUCT нерешенным ссылку

Я хочу, чтобы скопировать структуру тм на другую структуру, но она бросает нерешенным внешняя ссылка

Ошибка 2 Ошибка LNK2001: неразрешенный внешний символ "общественности: статическая структура тм * DateUtils :: generateDateTimeStruct" (generateDateTimeStruct @ DateUtils @@ 2PAUtm @@ A?)

class DateUtils 
{ 
public: 

    DateUtils() 
    { 

    } 

    static int getTodaysDate(); 
    static tm * myDateTime; 
    static void generateDateTimeStruct(); 

}; 

tm* DateUtils::myDateTime = NULL; 

int DateUtils::getTodaysDate() 
{ 
    // If i comment the calling, it does not throws an error 
    generateDateTimeStruct(); 
    return DateUtils::myDateTime->tm_hour; 
} 
static void generateDateTimeStruct(){ 
     time_t now = time(0); 
     static tm s; 
     now = time(NULL); 
     localtime_s(&s, &now); 

     DateUtils::myDateTime = &s; 

} 
+1

Вы только объявили статический член 'myDateTime', вам нужно определить его – billz

ответ

1

Вы должны определить этот элемент вне объявления класса (в некоторых CPP-файл):

tm* DateUtils::myDateTime = NULL; 

Обратите внимание, что префиксы с именем класса используется при определении других членов, а также:

В объявлении класса:

static int getTodaysDate(); 
static void generateDateTimeStruct(); 

но определение вне класса:

int DateUtils::getTodaysDate() { ... } 
void DateUtils::generateDateTimeStruct() { ... } 
+0

Eventhough я определил его, он по-прежнему бросает ту же ошибку – meWantToLearn

+0

@meWantToLearn: Смотрите мой выбор :) – LihO

0

Как было объявлено, что myDateTime имеет статическое хранилище, вам необходимо присвоить ему некоторую память.

Нормальная вещь, чтобы сделать это определить это точно в одном компиляционном блоке; обычно в исходном файле:

tm* Wrapper::myDateTime = NULL; 
+0

Даже с назначением памяти к нему, он по-прежнему бросает та же ошибка – meWantToLearn

0

Вы должны определить элемент статических данных. Он был объявлен только в определении класса, но не определен вне класса. В некотором модуле кода напишите

tm * Wrapper::myDateTime; 
+0

Я сделал это как-ну, но все же такая же ошибка. – meWantToLearn

+0

В заголовке должно быть, как и раньше, статическое tm * myDateTime; Вне заголовка в некотором модуле кода должно быть tm * DateUtils :: myDateTime; Я не вижу, где сейчас находится Wrapper. –

+0

Я обновил код, его металическую ошибку ссылки на DateUtils :: generateDateTimeStruct. Его вызов статического метода из статического метода. Я просто не могу понять, почему он не работает без какой-либо ошибки. – meWantToLearn

0

Вы объявляете функцию-член, но определяете функцию, не являющуюся членом с тем же именем. Измените определение к

static void DateUtils::generateDateTimeStruct(){ 
    // your code here 
} 

С другой стороны, не определить класс вообще - кажется, просто где-то поставить статические функции, в этом случае пространство имен было бы более уместным.

Смежные вопросы