C++;类未初始化 在C++中,由于递归,无法将头文件包含在一起。所以你必须使用预定义的类,对吗?所以我想得到C.hpp中num的值,然后在B.hpp中打印出来

C++;类未初始化 在C++中,由于递归,无法将头文件包含在一起。所以你必须使用预定义的类,对吗?所以我想得到C.hpp中num的值,然后在B.hpp中打印出来,c++,pointers,initialization,C++,Pointers,Initialization,C类在预期的B类之前初始化 但是当我试图调用A::instance->c时,它是NULL A.hpp #include <iostream> class C; // PREDEFINED CLASS class B; // PREDEFINED CLASS class A { public: inline static A* instance; C* c{ 0 };

C类在预期的B类之前初始化

但是当我试图调用A::instance->c时,它是NULL

A.hpp

#include <iostream>
class C;                        // PREDEFINED CLASS
class B;                        // PREDEFINED CLASS
class A {
public:
    inline static A* instance;
    C* c{ 0 };
    B* b{ 0 };

    A() {
        instance = this;
    }

    void start(B* b,C* c) {
        this->c = c;
        this->b = b;
    }
};
#include "A.hpp"
#include "C.hpp"

class B {
public:

    void call() {
        if (A::instance->c)
            std::cout << "C Num: " << A::instance->c->num << "\n";
        else std::cout << "C Class is NULL!\n";
    }

    B() {
        std::cout << "B init!\n";
        call();
    }
};
class C {
public:
    int num = 0;

    C() {
        std::cout << "C init!\n";
        num = 69;
    }
};
#include "A.hpp"
#include "B.hpp"
#include "C.hpp"

void main() {
    A a;
    a.start(new B(), new C());
}
C类在预期的B类之前初始化

不,这不是预期的,函数参数的求值顺序未指定

但是,即使在您的示例输出中是这种情况,您已经创建了新的C类对象,现在您正在尝试创建B类对象,在此期间,您正在尝试访问
A::instance->C
,而尚未设置

您在
start
函数中为类A对象设置了
c
,但在调用过程中仍在评估其参数,并且没有到达函数的实际主体


因此,类A中的
c
是您通过
c*c{0}设置的默认值0a.start(new B(),new C())
中,显然
B
C
的构造函数必须在调用
start
之前运行,但是
B
的构造函数希望
a::instance
已经有一个有效的
C
指针。您可以通过使用两个单独的设置器来修复此设计:首先创建
C
,在
a
中设置它,然后构建并设置
B
。请不要使用代码图像。我不能理解这个问题,因为你必须在问题中的图像和代码之间切换才能得到你要问的。为什么你认为
A::instance->c
应该在
B
的构造函数中设置?为什么你不让
A
的构造函数创建
B
c
实例(按正确的顺序)?是的,您不能在
a.hpp
中实现这样的构造函数-但您可以在
a.cpp
中实现,如果需要,它可以很高兴地包含所有三个头。我强烈怀疑显示的代码不是存在所谓问题的真实代码,原因如下:1)没有现代C++编译器会接受<代码>空白main < /代码>。2)如果遵循包含链,<代码> C.hpp <代码>被包含两次,一次从<代码> B.hpp < /C> >然后直接从<代码>源代码> CPP<代码>中,这将导致每个自尊心的C++编译器重复一个类定义。