我有很多必须用 C++ 编写的 C# 代码。我在 C++ 方面没有太多经验。
我正在使用 Visual Studio 2012 进行构建。该项目是 C++ 中的静态库(不在 C++/CLI 中)。
我正在创建一些 UnitTest,在 C# 版本中,它们有一个类TestData、一些TestData的静态实例和一个静态Initialize方法,用于为这些静态实例设置值。
当我在 C++ 中尝试相同时,我发现如果我的 Initialize 方法在 TestData 类中声明,它就不起作用。但如果我在外面声明它,它会起作用。
C++(测试)
TEST_CLASS(UnitTest1)
{
public:
TEST_CLASS_INITIALIZE(ClassInitialize)
{
TestData::Initialize();
}
TEST_METHOD(TestMethod1)
{
Assert::AreEqual(data0.testValue, 30);
}
};
C++(TestData 类中的初始化方法):
测试失败,并声明了这样的 Initialize 方法。当我调试时,我看到 testValue 被设置,但是当它到达资产时又回到 0。
//.h
namespace Data
{
class TestData
{
public:
TestData(void);
~TestData(void);
int testValue;
static void Initialize();
};
static TestData data0 = TestData();
}
//.cpp
namespace Data
{
TestData::TestData(void){}
TestData::~TestData(void){}
void TestData::Initialize()
{
data0.testValue = 30;
}
}
C++(在类外声明的初始化方法):
使用这样的代码,我的测试有效。
//.h
namespace Data
{
class TestData
{
public:
TestData(void);
~TestData(void);
int testValue;
};
static TestData data0 = TestData();
static void Initialize()
{
data0.testValue = 30;
}
}
为什么会这样?
更新:
按照汉斯的建议,我跟踪了正在使用的变量的地址。它帮助我注意到,由于某种原因,TestData的构造函数被调用了两次。我不知道为什么。我想可能是调用了自动分配,所以我在构造函数中添加了一个 int 参数,看看会发生什么,似乎它调用了data0的构造函数两次。
当我的测试不起作用时(在类中有 Initialize),调用顺序是:
- TestData (data0) 构造函数(地址:1)
- TestData (data0) 构造函数(地址:2)
- 初始化:使用地址为 1的 data0
- 测试:使用带有地址 2的 data0
当我的测试工作(在类外初始化)时,调用顺序是:
- TestData (data0) 构造函数(地址:1)
- TestData (data0) 构造函数(地址:2)
- 初始化:使用地址为 2的 data0
- 测试:使用带有地址 2的 data0
现在我明白为什么我的测试失败了。但我不明白为什么构造函数被调用两次,为什么在一种情况下使用两个实例,而在另一种情况下只使用第二个实例。