У меня есть немного класса под названием Материал, в котором я хочу сохранить вещи. Этими вещами является список интервала типа. Всюду по моему коду в любых классах, которые я использую, я хочу смочь получить доступ к этим вещам в классе Материала.
Main.cpp:
#include "Stuff.h"
int main()
{
Stuff::things.push_back(123);
return 0;
}
Stuff.h:
#include <list>
class Stuff
{
public:
static list<int> things;
};
но я получаю некоторые ошибки сборки с этим кодом:
ошибка LNK2001: неразрешенная внешняя ссылка "общественность: статический станд. класса:: список <интервал, станд. класса:: средство выделения <интервал>> Материал:: вещи" (? things@Stuff @@ 2 В? $list@HV? $allocator@H@std @@@ станд. @@ A) Main.obj CSandbox
фатальная ошибка LNK1120: 1 неразрешенный C:\Stuff\Projects\CSandbox\Debug\CSandbox.exe CSandbox внешнего облика
Я - парень C#, и я пытаюсь изучить C++ для параллельного проекта. Я думаю, что не понимаю, как C++ рассматривает статических участников. Поэтому объясните, что я имею неправильно здесь.
Упоминание статического члена в декларации класса является только декларацией . Вы должны включить одно определение статического члена, чтобы компоновщик правильно все подключил. Обычно вы включаете в файл Stuff.cpp
нечто подобное:
#include "Stuff.h"
list<int> Stuff::things;
Не забудьте включить Stuff.cpp
в свою программу вместе с Main.cpp
.
Stuff::вещи только объявлены, но не определены.
пожалуйста, используйте:
// Stuff.cpp
#include "Stuff.h"
std::list<int> Stuff::things;
Added: это также хорошая практика защиты заголовочных файлов от многократного включения:
// Stuff.h
#ifndef STUFF_H_
#define STUFF_H_
#include <list>
class Stuff {
public:
static std::list<int> things;
};
#endif
Просто для справки, почему это работает, что в С++ все глобальные переменные (в том числе и статические глобальные) создаются до начала выполнения основной функции.
.Статический член должен быть объявлен в классе, но определен в единице (cpp-файле), где он действительно находится.
Единственное исключение в случае, если класс является шаблоном: в этом случае необходимо определить член вне класса, но необходимо также объявить его в заголовочном файле.
.Статические члены данных должны быть определены вне объявлений класса, так же как и методы.
Например:
class X {
public:
static int i;
};
Должны быть также:
int X::i = 0; // definition outside class declaration