Почему моя программа C++ не свяжется, когда мой класс будет иметь статических участников?

У меня есть немного класса под названием Материал, в котором я хочу сохранить вещи. Этими вещами является список интервала типа. Всюду по моему коду в любых классах, которые я использую, я хочу смочь получить доступ к этим вещам в классе Материала.

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++ рассматривает статических участников. Поэтому объясните, что я имею неправильно здесь.

6
задан Rob Kennedy 29 December 2009 в 22:57
поделиться

5 ответов

Упоминание статического члена в декларации класса является только декларацией . Вы должны включить одно определение статического члена, чтобы компоновщик правильно все подключил. Обычно вы включаете в файл Stuff.cpp нечто подобное:

#include "Stuff.h"

list<int> Stuff::things;

Не забудьте включить Stuff.cpp в свою программу вместе с Main.cpp.

.
15
ответ дан 8 December 2019 в 03:39
поделиться

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
4
ответ дан 8 December 2019 в 03:39
поделиться

Просто для справки, почему это работает, что в С++ все глобальные переменные (в том числе и статические глобальные) создаются до начала выполнения основной функции.

.
2
ответ дан 8 December 2019 в 03:39
поделиться

Статический член должен быть объявлен в классе, но определен в единице (cpp-файле), где он действительно находится.

Единственное исключение в случае, если класс является шаблоном: в этом случае необходимо определить член вне класса, но необходимо также объявить его в заголовочном файле.

.
0
ответ дан 8 December 2019 в 03:39
поделиться

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

Например:

class X {
    public:
        static int i;
};

Должны быть также:

int X::i = 0; // definition outside class declaration
7
ответ дан 8 December 2019 в 03:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: