C++ 成员函数中静态变量的替代方法
我一直依赖于一种误解,即成员函数中定义的静态变量仅限于特定的类实例 为了说明我的误解:C++ 成员函数中静态变量的替代方法,c++,templates,static,C++,Templates,Static,我一直依赖于一种误解,即成员函数中定义的静态变量仅限于特定的类实例 为了说明我的误解: #include <iostream> #include <string> struct Simple { template<typename T> T & Test(const T & Value) { static T Storage = Value; return Storage; } };
#include <iostream>
#include <string>
struct Simple {
template<typename T>
T & Test(const T & Value) {
static T Storage = Value;
return Storage;
}
};
int main() {
Simple A;
Simple B;
std::string Foo = A.Test(std::string("Foo"));
std::string Bar = B.Test(std::string("Bar"));
std::cout << Foo << ' ' << Bar << std::endl;
}
#包括
#包括
结构简单{
模板
T&T测试(常数T&T值){
静态T存储=值;
返回存储;
}
};
int main(){
简单A;
简单B;
std::string Foo=A.Test(std::string(“Foo”);
std::string Bar=B.Test(std::string(“Bar”);
如果我理解你的困惑,另一种选择是成员变量
template<typename T>
struct Simple {
T storage;
T & Test(const T & Value) {
storage = Value;
return Storage;
}
};
模板
结构简单{
T储存;
T&T测试(常数T&T值){
储存=价值;
返回存储;
}
};
尽管多次调用成员函数Test
,但上述语句只执行一次。因此,将声明和初始化分开
template<typename T>
T & Test(const T & Value) {
static T Storage;
Storage = Value; // Now, this is guaranteed to execute during member function calls.
return Storage;
}
模板
T&Test(常数T&Value){
静态T存储;
Storage=Value;//现在,这保证在成员函数调用期间执行。
返回存储;
}
这应该可以满足您的需要。您可以将其转换为一个常规的非静态类变量,尽管这需要类作为模板而不是函数
template<typename T>
struct Simple
{
T& Test( const T& value )
{
storage = value;
return storage;
}
private:
T storage;
}
模板
结构简单
{
T&T测试(常数T&T值)
{
储存=价值;
返回存储;
}
私人:
T储存;
}
不幸的是,我正在使用静态变量来存储类的数据,因此我可以查找typeint
并检索我存储在那里的任何内容。这更多地是您系统的设计限制。为此,您需要将数据放入一个无类型字段中,并存储某种标识符,然后使用它来获取数据。结束拙见。但是存储仍然是静态的,所以下一个执行它的类实例仍然会覆盖该值,对吗?是的,您是正确的。如果每个实例都需要它自己的变量,那么OP根本没有必要将其声明为静态的。您根本不清楚要实现什么。如果您删除static
或per在静态变量声明之后立即形成赋值(正如Mahesh所建议的那样),它们都将为您提供预期的输出。@在代码示例中,我在编译时误用static生成匿名成员变量。对GetArray
的后续调用将返回对匿名成员变量的引用。
template<typename T>
T & Test(const T & Value) {
static T Storage;
Storage = Value; // Now, this is guaranteed to execute during member function calls.
return Storage;
}
template<typename T>
struct Simple
{
T& Test( const T& value )
{
storage = value;
return storage;
}
private:
T storage;
}