c++ - 来自命名空间的静态变量不会递增

标签 c++ static namespaces

我正在使用我自己的命名空间 alg 实现快速排序。

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;

最佳答案

声明为 static 的 namespace 范围变量具有内部链接,这意味着每个翻译单元(=.cpp 文件)都有自己的拷贝。 那么在您的情况下可能发生的情况是实现 quicksortpartition 的文件中的拷贝增加了,但是 main() 中的拷贝增加了> 不是。

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

namespace alg
{
  unsigned int comparisons = 0;
}

关于这方面的更多信息可以引用自己喜欢的good C++ book .

关于c++ - 来自命名空间的静态变量不会递增,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20911134/

相关文章:

c# - 使用 C# 解析具有多个命名空间的 Xml

c++ - 如何在使用 Win32 API 创建的窗口上添加淡入/淡出效果

c++ - Cython 为 libcpp.list 赋值

dart - Dart中的静态构造函数

dll - 静态链接搜索动态符号(VS 2015)

php - Pimcore:通过包含类名的字符串创建命名空间对象

c++ - 在另一个成员函数的尾随返回类型中获取推导成员函数的 decltype 是否格式正确?

c++ - 为什么我的二维数组的第二行从 RAM 中获取随机值?

java - 重新声明参数

VB.NET 在实现接口(interface)时调整自动生成代码