определение статической переменной базового класса - PullRequest
1 голос
/ 16 августа 2011

У меня есть структура класса:

A <- B

где A - базовый класс, а B - производный. Некоторый независимый код создает объект обоих этих классов. A имеет статическую переменную (скажем, «static_a»), которая используется как в A, так и в B.

Где мне определить этот static_a? Когда я определяю это в A.h, это дает мне ошибку компоновщика, говоря множественное определение. Затем я перенес его в файл A.cc, и компиляция прошла Но меня смущает, получат ли класс B (который определен в Bh и B.cc, который не видит определения в A.cc) правильные значения, определенные для переменной static_a, как это определено в A.cc?

Спасибо за помощь!

Ответы [ 2 ]

4 голосов
/ 16 августа 2011

Определение статической переменной немного похоже на объявление переменной extern или прототипа функции.Он сообщает компоновщику, что переменная или функция существует где-то во всех единицах компиляции, но он не создает переменную , он просто говорит, что она где-то будет существовать.Переменная не существует.

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

Когда вы помещаете фактическое определение в файл cc, вы создаете переменная там один раз , и каждый раз, когда кто-то использует ее где-то еще в проекте, он использует эту.

Так что, по сути, вы все делаете правильно.

2 голосов
/ 16 августа 2011

Объявите вашу переменную в заголовке и определите ее (инициализируйте) в файле cc. B классу нужно только объявление вашей статики. Не нужно беспокоиться, это сработает.

хиджры

class A{
    public:
    static int x;
};

A.cc

int A::x = 0;

B.h

class B : public A{
    void foo()
    {
        if ( A::x == 0 ) 
        //this is true
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...