Статические переменные-члены одного и того же класса в C ++ - PullRequest
2 голосов
/ 25 апреля 2010

Я пытаюсь создать класс, который содержит статический указатель на сам экземпляр. Вот пример:

хиджра:

#include <iostream>

#ifndef _A_H
#define _A_H

class A {
 static A * a;
};

A * a = NULL;

#endif

Однако, когда я включаю A.h в другой файл, например:

#include "A.h"

class B {

};

Я получаю следующую ошибку:

ld: duplicate symbol _a in /Users/helixed/Desktop/Example/build/Example.build/Debug/Example.build/Objects-normal/x86_64/B.o and /Users/helixed/Desktop/Example/build/Example.build/Debug/Examplebuild/Objects-normal/x86_64/A.o

Я использую компилятор Xcode по умолчанию в Mac OS X Snow Leopard.

Ответы [ 2 ]

5 голосов
/ 25 апреля 2010

Эта строка:

A * a = NULL;

должно выглядеть так:

A *A::a = NULL;

И вам нужно переместить его из файла заголовка и поместить в исходный файл (.cpp).

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

2 голосов
/ 25 апреля 2010

Поскольку глобальная переменная a определена в A.cpp и B.cpp. Один публичный символ должен быть определен только в одном месте. Остальные могут узнать, что такое содержание этого символа по ссылке.

Переместите линию A* a = NULL от A.h до A.cpp.

(Кстати, для обозначения a в классе A используйте A* A::a = NULL;, в противном случае вы создаете a в глобальном пространстве имен.)

...