2014-01-03 4 views
1

Я реализую quickSort, используя собственное пространство имен alg.Статическая переменная из пространства имен не увеличивается

namespace alg 
{ 
    static unsigned int comparisons(0); 
    void quickSort (std::vector<int>& a); 
    int partition (std::vector<int>& b, int leftIndex); 
} 

мне нужно подсчитать сравнение элементов в массиве, по этой причине я использую статическую переменную comparisons, который получает приращение функций, но в main.cpp она по-прежнему остается 0.

Что не так? Почему в main.cpp я предполагаю, что для каждого файла .cpp существует статическая переменная serapate comparisons, но я не уверен. Во всяком случае, как я могу это исправить? Мне действительно нужно написать класс, где я могу хранить статическую переменную? Или это все равно не поможет?

И предложите, где я могу найти подробную информацию о статических переменных и пространствах имен?

QuickSort.cpp

void alg::quickSort(std::vector<int>& a) 
{ 
.... 
    comparisons+=1; 
} 

int alg::partition(std::vector<int>& a, int leftIndex) 
{ 
    comparisons+=a.size()-1; 
.... 
} 

main.cpp

alg::quickSort(myvec); 
... 
std::cout << alg::comparisons << std::endl; 
+2

Возможно, вам захочется показать строки, изменяющие переменную и использующие ее. Глобальная переменная сохраняет свои значения. BTW, ** намного лучший подход к подсчету операций, которые он передал в функции сравнения как объект функции, и которые содержат счетчик, используя, например, указатель на локальную переменную в 'main()': глобальные переменные Плохо. –

+0

«Я думаю, для каждого .cpp-файла есть статические сопоставления по сравнению с serapate, но я не уверен. В любом случае, как я могу это исправить?». Удалить статические – deviantfan

ответ

5

переменной пространства имен-сфера объявлена ​​static имеет внутреннюю связь, а это означает, что каждый перевод блока (= .cpp файл) получает свою собственную копию. Итак, что может произойти в вашем случае, так это то, что копия в файле, реализующая quicksort и partition, увеличивается, но в main() нет.

Что вам нужно сделать, это заменить static ключевое слово с extern ключевое слово (чтобы сделать эту линию только объявление), а затем определить переменную в одном .cpp файл (вероятно, реализующей quicksort и partition):

namespace alg 
{ 
    unsigned int comparisons = 0; 
} 

Что касается поиска дополнительной информации об этом, обратитесь к своему любимому good C++ book.

2

Почему в main.cpp я думаю, для каждого файла .cpp существует serapate статические переменные сравнения, но я не уверен,

Это верно.

Namespace- static означает, что файл является локальным. Это не то же самое, что и класс-static.

Возможно, вы использовали extern.

+1

Ах да, это объясняет путаницу OP. Стремление авторов стандартов C++ к повторному использованию существующих ключевых слов нанесло еще один удар! (Они имеют тенденцию делать это, потому что каждое новое ключевое слово разбивает существующий код: путем повторного использования 'static' из C, более C-кода, скомпилированного в C++) – Yakk

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