2016-02-24 3 views
3

Это пример, взятый из geeksforgeeks. Я не понимаю следующий код.Как использовать статическую переменную в шаблоне класса C++

template<class T> int Test<T>::count = 0; 

Рассчитывает внешнюю переменную? Почему бы просто не дать статическому int count = 0? Описание и код в geeksforgeeks перечислены ниже.

Шаблоны классов и статические переменные: Правило для шаблонов классов же, как и функция шаблонов Каждой конкретизации шаблона класса имеет свою собственную копию члены статических переменные. Например, в следующей программе есть два примера Test and Test. Таким образом, существуют две копии статического счета .

#include <iostream> 

using namespace std; 

template <class T> class Test 
{ 
private: 
    T val; 
public: 
    static int count; 
    Test() 
    { 
    count++; 
    } 
    // some other stuff in class 
}; 

template<class T> 
int Test<T>::count = 0; 

int main() 
{ 
    Test<int> a; // value of count for Test<int> is 1 now 
    Test<int> b; // value of count for Test<int> is 2 now 
    Test<double> c; // value of count for Test<double> is 1 now 
    cout << Test<int>::count << endl; // prints 2 
    cout << Test<double>::count << endl; //prints 1 

    getchar(); 
    return 0; 
} 

ответ

2

Каждый раз, когда создается экземпляр объекта Test с новым типом, новый класс из имеющихся шаблонов создан для Вас. (Итак, в вашем случае есть Test<int> и Test<double> классы, созданные по запросу для вас компилятором). Теперь вы можете думать о Test<int> и Test<double> как о двух отдельных классах, созданных из того же шаблона.

Поскольку существуют два класса, в разных областях есть две копии статической переменной с тем же именем. template<class T> int Test<T>::count = 0; - это шаблон для определения этого count в классах, созданных по требованию.

Если вы специализируетесь это определение какого-либо типа, например:

template<> 
int Test<int>::count = 5; 

Test<int>::count будет 7 во время печати. Пока Test<double>::count останется 1 (без изменений).

1

count не является внешней переменной. Причина, по которой он выходит за пределы класса, заключается в том, что переменная должна быть выделена (и, возможно, создана). Когда статическая переменная находится внутри определения класса, она сообщает только компилятору: «там будет такая переменная», но поскольку определения могут быть включены во многие исходные файлы, компилятор не будет выполнять никаких распределений.

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

1

Class Test - это класс шаблонов, что означает, что компилятор будет генерировать разный код каждый раз, когда он встречает код, который создает экземпляр Test с другим типом.

Граф не является внешней переменной; это статическая переменная.

Существует один экземпляр статической переменной, общий для всех экземпляров их классов контейнеров.

Твист здесь заключается в том, что Test является классом шаблонов, поэтому на самом деле не существует только одного «теста класса». Есть два: функция main() заставит компилятор генерировать «тест класса» и «тест класса».

Как отмечено, статическая переменная разделяется всеми экземплярами их классов контейнеров. Как также отмечено, существуют два сгенерированных типа класса Test (int и double).Поскольку count является статической переменной, это означает, что должен быть один экземпляр счетчика за тип теста. Поэтому компилятор будет генерировать как:

int Test<int>::count = 0; 

и

int Test<double>::count = 0; 

Имейте в виду, что цель шаблонов является то, что вы пишете код один раз и полагаться на компилятор для генерации кода для всех различных типов данных для которого используется этот шаблон.

Смежные вопросы