c ++ copy struct неразрешенная ссылка [duplicate]

0

Я работаю над классом оболочки даты в c++

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

Ошибка 2 ошибки LNK2001: неразрешенный внешний символ "public: static struct tm * 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 , вам нужно определить его
Теги:
struct

4 ответа

1
Лучший ответ

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

tm* DateUtils::myDateTime = NULL;

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

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

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

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

int DateUtils::getTodaysDate() { ... }
void DateUtils::generateDateTimeStruct() { ... }
  • 0
    Несмотря на то, что я определил это, он все равно выдает ту же ошибку
  • 0
    @meWantToLearn: см. мое редактирование :)
0

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

tm * Wrapper::myDateTime;
  • 0
    Я сделал это как хорошо, но все же ошибка.
  • 0
    В заголовке должно быть как раньше static tm * myDateTime; Вне заголовка в некотором модуле кода должно быть tm * DateUtils :: myDateTime; Я не вижу, где сейчас Обертка.
Показать ещё 2 комментария
0

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

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

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

0

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

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

tm* Wrapper::myDateTime = NULL;
  • 0
    Даже с выделением памяти все равно выдает ту же ошибку

Ещё вопросы

Сообщество Overcoder
Наверх
Меню