gpt4 book ai didi

c++ - 使用静态变量和模板

转载 作者:IT老高 更新时间:2023-10-28 22:02:59 27 4
gpt4 key购买 nike

我在这样的头文件中定义了一个模板类。这里我也定义了一个静态变量:

#ifndef TEST1_H_
#define TEST1_H_

void f1();

static int count;

template <class T>
class MyClass
{
public:

void f()
{
++count;
}


};

#endif

我在不同的 cpp 文件中定义了 main() 函数,如下所示:

int main(int argc, char* argv[])
{
MyClass<int> a;
a.f();
f1();

cout<<"Main:" << count << "\n";

return 0;
}

我在不同的 cpp 文件中实现了函数 f1(),如下所示:

void f1()
{
MyClass<int> a;
a.f();

cout<<"F1: " <<count <<"\n";
}

当我使用 VC6 编译它时,我得到的输出是“F1:0 Main:2”。这怎么可能?另外,如果我想将静态变量与模板一起使用,一般应该如何处理?

最佳答案

您将获得同一个变量的两个拷贝,因为您在头文件中声明了一个静态变量。当你声明一个全局变量 static这样,您说它是编译单元的本地(.o 文件)。由于您在两个编译单元中包含 header ,因此您将获得 count 的两个拷贝.

我认为您在这里真正想要的是与模板类的每个实例关联的静态模板成员变量。它看起来像这样:

template <class T>
class MyClass
{
// static member declaration
static int count;
...
};

// static member definition
template<class T> int MyClass<T>::count = 0;

这将为您计算模板的每个实例化。也就是说,您将拥有 MyClass<int> 的计数。 , MyClass<foo> , MyClass<bar>f1()现在看起来像这样:

void f1() {
MyClass<int> a;
a.f();

cout<<"F1: " << MyClass<int>::count <<"\n";
}

如果您想计算 MyClass 的 所有 个实例化(无论其模板参数如何),您确实需要使用 全局变量

但是,您可能不希望直接使用全局变量,因为您冒着在初始化之前使用它的风险。您可以通过创建一个返回对您的计数的引用的全局静态方法来解决此问题:

int& my_count() {
static int count = 0;
return count;
}

然后像这样在您的类(class)中访问它:

void f() {
++my_count();
}

这将确保 count 在使用之前被初始化,无论您从哪个编译单元访问它。见 C++ FAQ on static initialization order了解更多详情。

关于c++ - 使用静态变量和模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/607259/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com