我正在使用自己的命名空间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;
答案 0 :(得分:5)
声明为static
的名称空间范围变量具有内部链接,这意味着每个翻译单元(= .cpp
文件)都有自己的副本。那么可能发生的事情是什么您的情况是,实施quicksort
和partition
的文件中的副本会增加,但main()
中的副本不会增加。
您需要做的是将static
关键字替换为extern
关键字(使该行只是一个声明),然后在一个.cpp
文件中定义变量(可能实施quicksort
和partition
)的那个:
namespace alg
{
unsigned int comparisons = 0;
}
有关详细信息,请参阅您最喜欢的good C++ book。
答案 1 :(得分:2)
为什么在main.cpp中我猜每个.cpp文件都有一个serapate静态变量比较,但我不确定
没错。
命名空间 - static
表示它是文件本地的。这与班级static
不同。
您可能打算使用extern
。