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

时间:2014-01-03 19:18:52

标签: c++ static namespaces

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

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

我需要计算数组中元素的比较,因此我使用静态变量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;
....
}

的main.cpp

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

2 个答案:

答案 0 :(得分:5)

声明为static的名称空间范围变量具有内部链接,这意味着每个翻译单元(= .cpp文件)都有自己的副本。那么可能发生的事情是什么您的情况是,实施quicksortpartition的文件中的副本会增加,但main()中的副本不会增加。

您需要做的是将static关键字替换为extern关键字(使该行只是一个声明),然后在一个.cpp文件中定义变量(可能实施quicksortpartition)的那个:

namespace alg
{
  unsigned int comparisons = 0;
}

有关详细信息,请参阅您最喜欢的good C++ book

答案 1 :(得分:2)

  

为什么在main.cpp中我猜每个.cpp文件都有一个serapate静态变量比较,但我不确定

没错。

命名空间 - static表示它是文件本地的。这与班级static不同。

您可能打算使用extern