例如:
#include <iostream>
#include <deque>
int func(int a){
std::deque<int> obj;
obj.push_back(a);
for(std::deque<int>::iterator it = obj.begin(); it!=obj.end();++it)
std::cout << *it << '\n';
return 0;
}
int main()
{
int x=2;
func(x);
func(x);
}
输出为:
2
2
所以它的意思是deque对象在达到func的结束范围后销毁。我不能对此做任何事情,除了返回值或添加到全局范围?无法通过向他或静态指针或其他东西添加静态来更改此对象的行为?我的意思是使用纯C ++看起来像:
int func(int a){
static int *p = new int;
}
和值将存储在函数调用之间但是如何对我不知道的stl容器执行相同的操作。
答案 0 :(得分:2)
如果你真的希望它是静态的,那么就这样做:
static std::deque<int> obj;
虽然这可能是一个坏主意:从概念上讲,你在程序中隐藏了状态,实际上,在它被销毁之后有可能访问该对象。 (你可以通过使用动态分配和泄漏对象来解决生命周期问题,如Drax的回答所示,如果你真的想要走这条特殊的痛苦之路)。
最好将状态封装在一个类中。然后,您可以准确控制何时创建和销毁,并且如果您愿意,可以拥有多个实例。
class thing {
public:
int func(int a) {
obj.push_back(a);
// and print it
}
private:
std::deque<int> obj;
};
int main() {
thing t;
t.func(2); // 2
t.func(3); // 2 3
}
答案 1 :(得分:2)
如果您想记住函数调用之间的数据,请将其存储在其他位置,或作为最后的手段将其设置为静态。 因此,要么选择Mike Seymour的答案,使其成为一个类的成员,要么在main中保留它,并将其传递给函数,如果您想要更改它,请确保通过引用传递:
int func(int a, std::deque<int> & obj){
//.. as you were
}
从main获取数据并传入:
int main()
{
int x=2;
std::deque<int> obj;
func(x, obj);
func(x, obj);
}
答案 2 :(得分:0)
简单地说:
int func(int a){
static std::deque<int>* obj = new std::deque<int>;
obj->push_back(a);
for(std::deque<int>::iterator it = obj->begin(); it!=obj->end();++it)
std::cout << *it << '\n';
}
但我不确定这是个好主意:)。