命名空间中的静态变量不会增加

Sas*_*kia 1 c++ static namespaces

我正在使用自己的命名空间实现quickSort alg.

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

我需要计算数组中元素的比较,因此我使用静态变量comparisons,GETS在函数中递增但在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;
....
}
Run Code Online (Sandbox Code Playgroud)

main.cpp中

alg::quickSort(myvec);
...
std::cout << alg::comparisons << std::endl;
Run Code Online (Sandbox Code Playgroud)

Rei*_*ica 5

声明的名称空间范围变量static具有内部链接,这意味着每个翻译单元(= .cpp文件)都有自己的副本.因此,在您的情况下可能发生的是文件中的副本实现quicksortpartition递增,但是其中的副本main()不是.

你需要做的是更换static用关键字extern关键字(使该行只是一个声明),然后在一个定义变量.cpp文件(可能是一个实现quicksortpartition):

namespace alg
{
  unsigned int comparisons = 0;
}
Run Code Online (Sandbox Code Playgroud)

至于查找更多相关信息,请参阅您最喜欢的好C++书籍.