C++ 这会打印出什么?为什么?你将如何修复它?[C+;+;]

C++ 这会打印出什么?为什么?你将如何修复它?[C+;+;],c++,class,header,C++,Class,Header,下面是打印出来的 0 2 应该打印出来 1 2 我尝试一行一行地遍历它,结果是UtilsA.cpp通过其GetNumber()函数返回0。它与UtilsC.cpp完全相同,并返回正确的数字。我能做些什么来解决这个问题,为什么会发生这种情况 乌蒂尔萨 UtilsA.cpp UtilsB.h UtilsB.cpp UtilsC.h UtilsC.cpp Main.cpp #包括 #包括“UtilsB.h” int main(){ 我很好奇,因为我不明白问题的原因,但所有学分都应该归他,我只是在这

下面是打印出来的

0 2
应该打印出来

1 2
我尝试一行一行地遍历它,结果是UtilsA.cpp通过其GetNumber()函数返回0。它与UtilsC.cpp完全相同,并返回正确的数字。我能做些什么来解决这个问题,为什么会发生这种情况

乌蒂尔萨 UtilsA.cpp UtilsB.h UtilsB.cpp UtilsC.h UtilsC.cpp Main.cpp
#包括
#包括“UtilsB.h”
int main(){

我很好奇,因为我不明白问题的原因,但所有学分都应该归他,我只是在这里确认他的答案

该问题可从代码中重现,并且可以按照代码中的说明解决。将UtilsC.h替换为:

namespace {
    class C {
    public:
        int GetNumber() const { return Number; }
    private:
        int Number = 2;
    };
    C& SingleNumberC() {
        static C* ans = new C();
        return *ans;
    }
}

int UtilsC::GetSingleNumber() {
    return SingleNumberC().GetNumber();
}

对于UtilsB.h,也要这样做。

欢迎使用堆栈溢出。请花点时间阅读并参考“您可以在此处询问什么和如何询问”中的资料。解决此类问题的正确工具是调试器。在询问堆栈溢出之前,您应该逐行检查代码。有关更多帮助,请阅读至少,您应该将您的问题包含在一个示例中,该示例再现了您的问题,以及您在调试器中所做的观察。我认为原因是无法保证翻译单元之间的初始化顺序。在B的构造函数中,
SingleNumberA
SingleNumberC
不能保证e已构建。请阅读此处:
#include "UtilsA.h"

namespace {
    class A {
    public:
        int GetNumber() const { return Number; }
    private:
        int Number = 1;
    };
    A SingleNumberA;
}

int UtilsA::GetSingleNumber() {
    return SingleNumberA.GetNumber();
}
namespace UtilsB {
    int GetSingleNumberA();
    int GetSingleNumberC();
}
#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();
}
namespace UtilsC {
    int GetSingleNumber();
}
#include "UtilsC.h"

namespace {
    class C {
    public:
        int GetNumber() const { return Number; }
    private:
        int Number = 2;
    };
    C SingleNumberC;
}

int UtilsC::GetSingleNumber() {
    return SingleNumberC.GetNumber();
}
#include <iostream>
#include "UtilsB.h"

int main() {
    std::cout << UtilsB::GetSingleNumberA() << " " 
    << UtilsB::GetSingleNumberC() << std::endl;
}
namespace {
    class C {
    public:
        int GetNumber() const { return Number; }
    private:
        int Number = 2;
    };
    C& SingleNumberC() {
        static C* ans = new C();
        return *ans;
    }
}

int UtilsC::GetSingleNumber() {
    return SingleNumberC().GetNumber();
}