Я работаю над классом оболочки даты в 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;
}
Вы должны определить этот элемент вне объявления класса (в некотором.cpp файле):
tm* DateUtils::myDateTime = NULL;
Обратите внимание, что при определении других членов используется префикс с именем класса:
В объявлении класса:
static int getTodaysDate();
static void generateDateTimeStruct();
но определение вне класса:
int DateUtils::getTodaysDate() { ... }
void DateUtils::generateDateTimeStruct() { ... }
Вы должны определить статический член данных. Он был объявлен только в определении класса, но не определен вне класса. В некоторых модулях кода пишите
tm * Wrapper::myDateTime;
Вы объявляете функцию-член, но определяете не-членную функцию с тем же именем. Измените определение на
static void DateUtils::generateDateTimeStruct(){
// your code here
}
В качестве альтернативы, вообще не определяйте класс - кажется, что нужно просто ставить статические функции, и в этом случае пространство имен было бы более подходящим.
Поскольку у myDateTime
было объявлено статическое хранилище, вам нужно назначить ему некоторую память.
Нормальная задача - определить ее в точности в одной единице компиляции; обычно в исходном файле:
tm* Wrapper::myDateTime = NULL;
myDateTime
, вам нужно определить его