C++;类未初始化 在C++中,由于递归,无法将头文件包含在一起。所以你必须使用预定义的类,对吗?所以我想得到C.hpp中num的值,然后在B.hpp中打印出来
C类在预期的B类之前初始化 但是当我试图调用A::instance->c时,它是NULL A.hppC++;类未初始化 在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 };
#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}设置的默认值0在a.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++编译器重复一个类定义。