C++ 继承同一个的基类的所有派生类使用同一个全局变量的三种方式

2023-11-17

定义全局变量类型

#ifndef D_HPP
#define D_HPP
#include <stdio.h>
class D
{
public:
	D() {printf("DDDDDDDD \n");}
	~D() {};

};

#endif // D_HPP

基类外声明和定义static变量

基类

A.hpp

#include "D.hpp"
static D d;

class A
{
public:
	A() {}
	~A() {}
	D* getD() { return &d;}
};
#endif // A_HPP

派生类B

B.hpp

#ifndef B_HPP
#define B_HPP

#include "A.h"

class B : public A
{
public:
	B():A() {printf("BBBBBBBBBBBB + %p\n", getD());}
	~B() {}
	

};

#endif // B_HPP

派生类C

C.hpp

#ifndef C_HPP
#define C_HPP

#include "A.h"

class C : public A
{
public:
	C():A() {printf("BBBBBBBBBBBB + %p\n", getD());}
	~B() {}
	

};

#endif // C_HPP

执行结果

#include <stdio.h>
#include "B.h"
#include "C.h"

int main(int argc, char **argv)
{
	B b;
	C c;
	return 0;
}

在这里插入图片描述

注意事项:

我们开发习惯将函数实现放在cpp文件中,如下
A.h

#include "D.hpp"
static D d;

class A
{	
public:
	A();
	~A();
	D* getD();
};

#endif // A_HPP

A.cpp

#include "A.h"
A::A()
{
}

A::~A()
{
}

D* A::getD() { return &d; }

B,C派生类写法类似,执行结果为:
在这里插入图片描述
可以看到执行了多次D类的构造函数,想要解决这个问题可以使用第二种方式extern

基类头文件定义extern变量,cpp文件初始化

基类

#include "D.hpp"
extern D* d;

class A
{
	
public:
	A();
	~A();
	D* getD();
};

#endif // A_HPP
#include "A.h"
D* d = new D();
A::A()
{
}

A::~A()
{
}

D* A::getD() { return d; }

执行结果

在这里插入图片描述

基类内声明,基类外定义static变量

基类

#ifndef A_H
#define A_H

#include "D.hpp"

class A
{
	
public:
	static D d;
	A();
	~A();
	D* getD();
};

#endif // A_HPP

#include "A.h"
D A::d;
A::A()
{
}

A::~A()
{
}

D* A::getD() { return d; }

基类外声明最好放在cpp文件中声明,不然其他地方引用头文件,可能会报重定义错误

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 继承同一个的基类的所有派生类使用同一个全局变量的三种方式 的相关文章

随机推荐

  • A Survey on Large Language Models for Recommendation

    本文是LLM系列的文章 针对 A Survey on Large Language Models for Recommendation 的翻译 大模型用于推荐的综述 摘要 1 引言 2 建模范式和分类 3 判别式LLM用于推荐 4 生成式L
  • 关于使用Mybatis时实体类字段切记要使用包装类型

    每周的博客从5月份有开始断更了 看来坚持每周写一篇博客缺失很难 不过从这周开始 除了一方面把之前的那几周没写的博客补回来 另一方面从这周开始要真正逼自己的写一篇博客 并争取在7月份前搭建起自己的个人博客网站 好 废话少说 接下来快速进入今天
  • 线性表的顺序表示--王道2024DS习题代码

    2024年王道数据结构考研复习指导第二章 线性表的顺序表示 课后综合应用题个人学习的相关运行代码 include
  • 详解Matplotlib中文字符显示问题

    文章目录 1 中文字体显示问题 2 几种解决方案 2 1 在绘图代码中设置全局字体 2 2 在绘图代码中设置局部字体 2 3 修改本机字符默认配置字体 2 4 自动区别系统然后选择字体 3 其他 3 1 platform模块 3 2 常见中
  • Latex 乘号 分号

    Latex 乘号 分号 frac 分号 times 乘号 举例
  • 在 QT Creator 上配置 opencv 环境的一些认识和注意点

    在 QT Creator 上配置 opencv 环境的一些认识和注意点 一 OpenCV4 QT Creator Cmake 我参考的视频是 https www bilibili com video BV163411b7mg spm id
  • Go redis操作

    Go redis的操作 五种数据结构的基本操作汇总 一 String 操作 命令 说明 Set key value 给数据库中名称为 key 的 string 赋予值 valueget key 返回数据库中名称为 key 的 string
  • 系统架构主题之七:基于架构的软件设计方法及应用

    1 基于架构的软件设计方法概念 关键词 ABSD 自顶向下 递归迭代 与需求同步 设计元素 视角与视图 用例和质量场景 预期和非预期等 总的来讲 ABSD方法分为如下六个大的阶段 1 体系结构需求阶段 相比传统软件系统设计 架构设计在需求获
  • Centos7 命令行安装JDK步骤

    在国内 甲骨文公司的jdk下载的速度是很慢的 这里建议使用国内华为云的jdk 两者没有区别 就是做了一个搬运工作 对国内使用JDK环境的人来说非常友好 第一步 选择自己合适的JDK版本 网站在下面给出 https repo huaweicl
  • 【数据库】JDBC编程

    前言 小亭子正在努力的学习编程 接下来将开启javaEE的学习 分享的文章都是学习的笔记和感悟 如有不妥之处希望大佬们批评指正 同时如果本文对你有帮助的话 烦请点赞关注支持一波 感激不尽 目录 前言 什么是JDBC JDBC工作原理 JDB
  • 杰里之内置触摸按键配置篇

    关于内置触摸按键感应原理 内置触摸按键检测模块是利用人体分布电容对触摸按键电容影响来进行按键检测的 如下图 当人体触摸外部电容按键时 IO 口外部电容增加 芯片内部的触摸感应模块可以检测到该电容 变化 从而检测到按键是否被按下 在没有触摸的
  • Opencv(C++)笔记--打开摄像头、保存摄像头视频

    1 打开摄像头 关键代码语句 VideoCapture cam 0 cam read img imshow cam img include
  • 算法基础--蒙特卡洛模拟

    蒙特 卡罗方法 Monte Carlo method 也称统计模拟方法 是二十世纪四十年代中期由于科学技术的发展和电子计算机的发明 而被提出的一种以概率统计理论为指导的一类非常重要的数值计算方法 是指使用随机数 或更常见的伪随机数 来解决很
  • uboot下实现U盘自动升级程序的思路分析(基于USB系统、eMMC系统、FAT32文件系统)

    1 常见的升级方式 1 1 应用程序升级 优点 在图形化界面操作 只需要选中升级文件并点击升级即可 操作简单 缺点 应用程序必须能正常启动 当程序出现bug就不能升级 可靠性差 总结 操作简单 适合用户 1 2 uboot下tftp升级 优
  • WebService入门教程(服务端发布WebService)

    本篇内容过多 时间紧迫的朋友可以通过目录快速筛选自己想要看的内容 本人接触webservice也没多久 也处于学习阶段 如果有错误请指正 如果已经是大神请略过这篇文章 这篇文章不涉及webservice的底层原理 属于入门级文章 就当是笔记
  • 系统找不到d3dcompiler_33.dll如何解决的?

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或者损坏了 这时你只需下载这个d3dcompiler 33 dll文件进行安装
  • Disconnected: No supported authentication methods available(server sent:public key)

    Putty登陆服务器时 报错 Disconnected No supported authentication methods available server sent public key 重置服务器密码即可
  • windows 平台的python语言 PCL 安装包

    之前很多人找我要点云数据处理的 PCL 的python语言PCL 的 whl 安装包 我统一放到百度网盘 就不一一回复了 目前仅支持python 3 6 3 7 版本 python pcl 0 3 0rc1 cp37 cp37m win a
  • ssm框架下的文件上传和下载

    ssm下的文件上传和下载 1 文件上传 1 1 文件上传需要的依赖 文件上传需要使用到 commons fileupload 和 commons io 两个 jar 包
  • C++ 继承同一个的基类的所有派生类使用同一个全局变量的三种方式

    定义全局变量类型 ifndef D HPP define D HPP include