请考虑以下代码:
#include <iostream> struct X { int foo() { // Can I get this to be an instance-specific static variable,please? static int i = 0; return i++; } }; int main() { X a,b; std::cout << a.foo() << ' '; std::cout << b.foo() << ' '; std::cout << b.foo() << '\n'; // output is: 0 1 2 // desired output: 0 0 1 }
是否可以获取这个静态变量i的每个X的实例的副本,而不需要将声明和初始化移动到一些远的,远的标题和构造函数?
我想要这个的原因是因为这个变量的值只在这个特定的功能(而且具体到它的成员函数的实例)中是相关的,例如最后一个调用参数,最后一次调用的时间等等.
这个想法背后的课程已经有些大了,扩展了一个单一功能中使用的这种微小变量的声明和初始化变得丑陋.
更新:请注意,我不想泄漏内存.当一个实例被破坏时,与之关联的变量也应被删除.
Update²:不可见(不幸的是)这个确切的语义确实没有正确的语言功能.
虽然有一些解决方法,但每个都引入了限制和陷阱
>放置“函数”声明和定义
>访问其他“真实”成员变量
>在派生类中重载“函数”
> …
考虑到这些含义,只是看起来最有效率地坚持第一件事:
struct A { int j = 0; int i = 0; int foo() { return i++ + j++; } };
而不是像这样的事情:
struct B { int j = 0; std::function<int()> foo = [this,i = 0]() mutable { return i++ + this->j++; }; };
或这个:
struct C { int j; struct Foo { int i; C *c; Foo(C *c) : i(),c(c) {} int operator() () { return i++ + c->j++; } } foo; C() : j(),foo(this) {} };
或这个:
struct D { int j = 0; std::map<std::string,int> i; int foo() { return i[__PRETTY_FUNCTION__]++ + j++; } };
或类似.
非常感谢您的意见和答案!
解决方法
不,不可能.
您可以使用两种备选方案:
>使变量成为一个成员,这是你想要的语义的语言特征;
>或发明一种新的语言.
我明白你的关注,但这真的只是因为你的班级显然太大了.分开责任