欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 幼教 > C++AB类相互包含

C++AB类相互包含

2025/2/27 9:40:36 来源:https://blog.csdn.net/a2025834646/article/details/139505757  浏览:    关键词:C++AB类相互包含

本文讨论我们该如何实现如下结构,而不会报错:

class A {B b;
}
class B{A a;
}

我们知道编译器的执行顺序是从上到下的,当我们在A中使用B时,B还没有定义,甚至没有声明,所以在这里我们先给代码加上一段前向声明。

class B;
class A {B b;
}

前向声明让编译器知道 B 类是存在的,但是这样还是不能还没有解决我们的问题,编译器依然会报错,因为 B b实际上是隐式调用了 B 类的构造函数,但是此时 B 类还没有定义,自然其构造函数也没有定义,所以这种用法不可行。

B b声明 B 对象不可行,那B* b 声明指针可不可行呢,答案是可行的,因为指针的创建不等于对象的创建。

class B;
class A{B* b;
}

问题是指针是创建了,但是并没有初始化,我们要怎么解决这个问题呢?

虽然直接在类中进行初始化是不可能的,因为编译器没法找到 B 类定义,但是我们可以先声明一个函数,但是其定义则放到 B 类的后面,这样就解决了编译器找不到 B 类定义的问题,然后我们在该函数定义内创建对象赋值给 B* b指针即可。

class B;
class A {B* b;void createB();
}
class B {A a;
}
void A::createB() {b = new B();
}

到这里问题的第一种解决方案就出来了,而另一种解决方案则是需要用到智能指针和 C++14 的新特性:make_unique。

#include <memory>
class B;
class A {
public:std::unique_ptr<B> bptr;A() {bptr = std::make_unique<B>();}
};class B {
public:A a;
};

这里的 make_unique<>() 可以在还没看到 B 类定义时创建 B 的智能指针对象,但这里还是存在陷阱,虽然确实创建了 B 的智能指针对象,但是我们仍然无法使用该智能指针,只要使用该指针编译器就会报错,原因自然还是编译器看不到 B 类的定义,所以编译器不知道如何给智能指针分配内存。

综上所诉,其实最终的解法在于了解到最大的问题是编译器无法看到 B 类的定义,并认识到如果 A 类函数的定义在 B 类定义之后编译器便能正常工作,那么问题的解法就出现了:在 A 类中定义 B 类的原始指针或者智能指针并将 A 类函数的定义置于 B 类定义之后,问题便解决了。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com