【问题标题】:Can I initialize references in a class? (perhaps in the constructor?)我可以在类中初始化引用吗? (也许在构造函数中?)
【发布时间】:2020-11-18 06:55:37
【问题描述】:

我的 C++ 有点生疏,尤其是 references

我有一个旧代码,类似于

TEST(SomeTest,someFunction){

AClass anObject= GetSomeObject();
ASingletonClass &aReference= ASingletonClass::GetInstance();
//... some more code
}

由于设计的原因我不得不重写这段代码,这次我必须使用一个辅助类(*)

class ASingletonClassFixture: public testing:Test{
 public:
  void SetUp() override
   {
     anObject=GetSomeObject();
     aReference=  ASingletonClass::GetInstance();
   }

 protected:
  AClass  anObject;
  ASingletonClass   &aReference;  //<--I don't think this is correct
}

我认为上面的代码是不正确的,因为引用应该在创建时初始化。

所以我的问题是我该如何做这样的事情?可以在构造函数中做吗?

(*) 如果你感兴趣——虽然不是必须知道——是因为我正在编写一个测试夹具。

【问题讨论】:

  • 是的,如果您使用 initialiser list,您可以在构造函数中执行此操作。
  • @john 好的,谢谢。对于简单的值,我可以得到它,但我可以把单例 GetInstance 也放在那里吗?怎么样?

标签: c++ unit-testing reference googletest


【解决方案1】:

是的,你可以在测试构造函数中这样做——甚至是推荐的方式:

class ASingletonClassFixture: public testing::Test{
 public:
    ASingletonClassFixture() : aReference{ASingletonClass::GetInstance()} {}

  void SetUp() override
   {
     anObject=GetSomeObject();
   }

 protected:
  AClass  anObject;
  ASingletonClass   &aReference;  //<--I don't think this is correct
};

this FAQ

但是,请注意,即使在 每个 测试主体之前调用了构造函数和 SetUp(顺序始终是 ctor、SetUp、测试主体、TearDown、dtor),假设您使用的是单例 - 它只会被初始化一次,并且它的状态将在测试用例之间共享!更重要的是,如果你在同一个测试二进制文件中有更多的测试套件,因为单例很可能是作为一个静态对象实现的,它将为整个测试二进制文件初始化一次,并在二进制文件的 main 方法退出时取消初始化.

【讨论】:

  • 谢谢。我想在代码中,SetUp 中的初始化不再需要了吧?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-18
  • 1970-01-01
  • 1970-01-01
  • 2011-07-01
  • 2021-11-06
  • 2017-10-15
  • 1970-01-01
相关资源
最近更新 更多