Статическое свойство C ++ - PullRequest
       16

Статическое свойство C ++

6 голосов
/ 24 октября 2010

У меня проблемы с доступом к статическому свойству в классе.Я получаю следующую ошибку:

shape.obj : error LNK2001: unresolved external symbol "public: static class TCollection<class Shape *> Shape::shapes"

Определение класса:

class Shape {

public:
    static Collection<Shape*> shapes;

    static void get_all_instances(Collection<Shape*> &list);
};

И реализация статического метода:

void Shape::get_all_instances(Collection<Shape*> &list) {
    list = Shape::shapes;
}

Похоже, что свойство shapes не инициализируется.

Ответы [ 5 ]

10 голосов
/ 24 октября 2010

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

Вы должны также определять их, просто добавьте следующую строку в файл, где находится ваша реализация.

Collection<Shape*> Shape::shapes;

И это должно сработать.

7 голосов
/ 24 октября 2010

Да. Вам нужно добавить

Collection<Shape*> Shape::shapes;

в одном из файлов .cpp для определения статического члена.

5 голосов
/ 24 октября 2010

Вы объявили shapes, но не определили его.

Добавить определение в файл реализации

Collection<Shape*> Shape::shapes; //definition
4 голосов
/ 24 октября 2010

Для кода «как есть» необходимо предоставить определение shapes, например (в файле реализации)

Collection<Shape*> Shape::shapes( whatever constructor args );

Но вместо этого вы можете рассмотреть функцию-член, которая возвращает ссылку на локальную статическую Collection<Shape*>.

Ура & hth.

3 голосов
/ 24 октября 2010

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

определение должно быть помещено в один файл cpp:

Collection<Shape*> Shape::shapes;
...