首页 > 编程语言 >C++AB类相互包含

C++AB类相互包含

时间:2024-06-07 23:00:51浏览次数:17  
标签:AB 定义 包含 C++ 智能 编译器 unique class 指针

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

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 类定义之后,问题便解决了。

标签:AB,定义,包含,C++,智能,编译器,unique,class,指针
From: https://blog.csdn.net/a2025834646/article/details/139505757

相关文章

  • 一篇文章带你搞懂C++引用(建议收藏)
    引用6.1引用概念引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。比如:李逵,在家称为"铁牛",江湖上人称"黑旋风"typedef是给类型取别名引用是给变量取别名注意:引用类型必须和引用实体是同种类......
  • [ABC354F] Useless for LIS
    写在最前面的话:如果你懂这道题的线段树或者树状数组解法,那么本题解对你可能没有帮助。题目传送门(Luogu)题目传送门(AtCoder)[ABC354F]UselessforLIS题面翻译给定一个长度为\(n\)的序列\(a\)。求出所有\(i\)使得存在任意一个\(a\)的最长上升子序列包含\(i\)。多测。......
  • 「杂题乱刷」AT_abc160_e
    代码康复训练2024.6.7无所谓,随便贪。直接取前\(x\)大的红苹果,前\(y\)大的绿苹果和和所有无色苹果合起来取最大的\(x+y\)个苹果的值加起来即可。容易证明一定合法。代码:点击查看代码/*Tips:你数组开小了吗?你MLE了吗?你觉得是贪心,是不是该想想dp?一个小时没调出......
  • 【BP时序预测】基于鱼鹰算法OOA优化BP神经网络实现温度数据预测算法研究附matlab代码
    以下是一个大致的步骤和MATLAB代码框架:数据准备:准备用于训练和测试的温度数据集。初始化BP神经网络:定义神经网络的结构(如隐藏层的数量和每层的神经元数量)。定义适应度函数:这是优化算法的目标函数,它应该根据神经网络的预测性能(如均方误差MSE)来评估神经网络的权重和偏置。......
  • 解决Docker遇到error NU1301: Unable to load the service index for source https://
    解决Docker容器内无法通过HTTPS访问外部网络的问题在使用Docker构建.NET项目时,有时会遇到无法通过HTTPS访问外部网络的问题,导致dotnetrestore命令无法从NuGet源下载依赖项。本文将介绍一种通过修改Docker配置文件config.json来解决该问题的方法。问题描述在......
  • atcoder ABC 353-A题详解
    atcoderABC353-A题详解ProblemStatementThereareNbuildingsalignedinarow.Thei-thbuildingfromthelefthasaheightofHi.Determineifthereisabuildingtallerthanthefirstonefromtheleft.Ifsuchabuildingexists,findtheposition......
  • 最大公约数(gcd())和最小公倍数(lcm())的c语言和c++详细解法
    最大公约数(gcd())和最小公倍数(lcm())最大公约数:定义:两个或多个整数共有的约数中最大的一个。例如:整数12和18,他们的公约数有1、2、3、6,其中最大的公约数是6。c语言解法:辗转相除法和更相减损法1、辗转相除法:思路:先求解较大的数除以较小的数的余数,再用较小的数除以前......
  • m基于PSO粒子群优化的LDPC码NMS译码算法最优归一化参数计算和误码率matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:     2.算法涉及理论知识概要       低密度奇偶校验码(Low-DensityParity-CheckCode,LDPC码)因其优越的纠错性能和近似香农极限的潜力,在现代通信系统中扮演着重要角色。归一化最小和(NormalizedMin-Sum,NMS)译码......
  • 基于GA-PSO遗传粒子群混合优化算法的DVRP问题求解matlab仿真
    1.程序功能描述       车辆路径问题(VehicleRoutingProblem,VRP)是运筹学领域的一个经典问题,旨在寻找满足一系列送货或取货需求的最优车辆行驶路径。DVRP是一个经典的组合优化问题,在物流配送、运输调度等领域有广泛应用。它要求确定一组最优路径,使得一定数量的车辆从起......
  • UV Cleavable Biotin-PEG2-alkyne
    【特性】分子式:C38H48N4O9S分子量:736.88外观:淡黄色或白色固体,存储条件:在-20°C的环境中长期保存,并且需要在暗黑处和干燥的条件下存放溶解性:大部分有机溶剂,同时也能够溶于水中结构式:【用途】主要适用于科研实验,特别是那些需要生物素标记的实验。通过紫外线照射,可以切断......