【发布时间】:2017-06-24 23:20:40
【问题描述】:
以下打印出来
0 2
应该打印出来
1 2
我尝试逐行遍历,并在 UtilsA.cpp 通过其 GetNumber() 函数返回 0 处结束。它与 UtilsC.cpp 完全相同,并返回正确的数字。我该怎么做才能解决这个问题?为什么会这样?
UtilsA.h
namespace UtilsA {
int GetSingleNumber();
}
UtilsA.cpp
#include "UtilsA.h"
namespace {
class A {
public:
int GetNumber() const { return Number; }
private:
int Number = 1;
};
A SingleNumberA;
}
int UtilsA::GetSingleNumber() {
return SingleNumberA.GetNumber();
}
UtilsB.h
namespace UtilsB {
int GetSingleNumberA();
int GetSingleNumberC();
}
UtilsB.cpp
#include "UtilsB.h"
#include "UtilsA.h"
#include "UtilsC.h"
namespace {
class B {
public:
B() : NumberA( UtilsA::GetSingleNumber() ), NumberC( UtilsC::GetSingleNumber() ) {}
int GetNumberA() const { return NumberA; }
int GetNumberC() const { return NumberC; }
private:
int NumberA;
int NumberC;
};
B SingleNumberB;
}
int UtilsB::GetSingleNumberA() {
return SingleNumberB.GetNumberA();
}
int UtilsB::GetSingleNumberC() {
return SingleNumberB.GetNumberC();
}
UtilsC.h
namespace UtilsC {
int GetSingleNumber();
}
UtilsC.cpp
#include "UtilsC.h"
namespace {
class C {
public:
int GetNumber() const { return Number; }
private:
int Number = 2;
};
C SingleNumberC;
}
int UtilsC::GetSingleNumber() {
return SingleNumberC.GetNumber();
}
Main.cpp
#include <iostream>
#include "UtilsB.h"
int main() {
std::cout << UtilsB::GetSingleNumberA() << " "
<< UtilsB::GetSingleNumberC() << std::endl;
}
【问题讨论】:
-
欢迎来到 Stack Overflow。请花时间阅读The Tour 并参考Help Center 中的材料,您可以在这里问什么以及如何问。
-
调试器是解决此类问题的正确工具。 在询问 Stack Overflow 之前,您应该逐行逐行检查您的代码。如需更多帮助,请阅读How to debug small programs (by Eric Lippert)。至少,您应该 edit 您的问题包含一个重现您的问题的 Minimal, Complete, and Verifiable 示例,以及您在调试器中所做的观察。
-
我认为原因是不能保证翻译单元之间的初始化顺序。在 B 的构造函数中。不保证
SingleNumberA或SingleNumberC已经构造。