gpt4 book ai didi

c++ - 前向声明是否完全消除了对指针类型的任何#including 的需要?

转载 作者:行者123 更新时间:2023-12-05 02:35:57 29 4
gpt4 key购买 nike

假设我们有一个源文件 A.cpp,我们在其中转发声明了一个 ClassB 类型,然后我们继续使用指向 ClassB 的指针,而没有 #including 文件 B.cpp(其中定义了 ClassB);在 B.cpp 中,我们转发声明 ClassA 并使用指向它的指针,而无需 #including A.cpp(定义 ClassA 的地方),那么编译器是否对此完全满意?符号解析会正常工作吗?换句话说,这两个目标文件在链接时间之前是否完全不需要了解彼此?

(我假设在没有对默认编译器进行任何更改的情况下在 visual studio 上编译 C++ 代码)

附言:

文件A.cpp

class ClassB;

class ClassA
{
bool JustTakeAClassBPointAndDoNothingWithIt(ClassB* class_b_pointer)
{
if(class_b_pointer)
return true;
else
return false;
return false;
}
}

文件B.cpp

class ClassA;

class ClassB
{
bool JustTakeAClassAPointAndDoNothingWithIt(ClassA* class_a_pointer)
{
if(class_a_pointer)
return true;
else
return false;
return false;
}
}

最佳答案

这个问题真的太笼统了,无法正确回答,但这是我的 2 美分。一般来说,只要你只引用一个类作为指向它的指针,编译就可以了。例如这个例子编译得很好:

class B;

int main() {
B * tst;
return 0;
}

但是,一旦您尝试实际实例化一个指针,或访问它的任何方法,您就需要一个完整的定义。这些示例将工作:

class B;

int main() {
B * tst = new B(); // error: allocation of incomplete type 'B'
return 0;
}

或者:

class B;

int main() {
B * tst;
tst->print(); // error: member access into incomplete type 'B'
return 0;
}

tl;博士;只要您实际上不与之交互,就可以使用不完整的类型。如果使用任何方法或函数,都需要提前声明(包括构造函数)

关于c++ - 前向声明是否完全消除了对指针类型的任何#including 的需要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70378650/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com