与并置到单个文件相比,多个文件中的不同代码行为

时间:2014-03-19 01:04:48

标签: c++

我放在单个文件中的代码在分成多个文件时表现不同。我在全局对象实例化过程中修改了一个类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

1 个答案:

答案 0 :(得分:1)

避免这种情况的一种方法是使用带有静态变量的静态函数。 例如:

class Collector
{
public:
  static std::vector<int> & GetInts(){ static std::vector<int> Ints; return Ints; }
};

这样一来,无论您使用哪个cpp文件,都可以保证静态变量在使用时被初始化。

我应该强调,这不是一个好主意,因为你会遇到线程问题。是否有充分理由使其静止?