我放在单个文件中的代码在分成多个文件时表现不同。我在全局对象实例化过程中修改了一个类static
中的std::vector
字段,我在main
中进行了分析。
我怀疑这是由于如何在不同的范围内创建对象,但我认为这种情况会导致共享同一个对象。
如何分离此代码并获得代码配置时看到的相同结果?
UPDATE 如果我在main.cpp中声明静态对象,则代码可以正常工作。这是唯一的方法吗?这感觉很乱,不是我要宣布的地方。
这是代码。
utils.h
#pragma once
#include <vector>
#include <iostream>
class Collector
{
public:
static std::vector<int> Ints;
};
class Aggregator
{
public:
Aggregator(int i);
};
的main.cpp
#include "utils.h"
// as noted in my updated question, if I declare Ints here, it works
// std::vector<int> Collector::Ints;
// but I want the freedom to declare this in any source
Aggregator inst(1);
int main()
{
std::cout << "size: " << Collector::Ints.size();
std::cin.get();
return 1;
}
utils.cpp
#include "utils.h"
std::vector<int> Collector::Ints;
Aggregator::Aggregator(int i)
{
Collector::Ints.push_back(i);
}
输出为size: 0
一个文件中的所有相同代码都是这样的:
#include <vector>
#include <iostream>
class Collector
{
public:
static std::vector<int> Ints;
};
class Aggregator
{
public:
Aggregator(int i);
};
#include "utils.h"
std::vector<int> Collector::Ints;
Aggregator::Aggregator(int i)
{
Collector::Ints.push_back(i);
}
Aggregator inst(1);
int main()
{
std::cout << "size: " << Collector::Ints.size();
std::cin.get();
return 1;
}
然后按照我的意愿输出size: 1
。
答案 0 :(得分:1)
避免这种情况的一种方法是使用带有静态变量的静态函数。 例如:
class Collector
{
public:
static std::vector<int> & GetInts(){ static std::vector<int> Ints; return Ints; }
};
这样一来,无论您使用哪个cpp文件,都可以保证静态变量在使用时被初始化。
我应该强调,这不是一个好主意,因为你会遇到线程问题。是否有充分理由使其静止?