C++静态成员函数访问非静态成员变量的方法

2023-11-01

静态成员函数不能访问非静态成员,这是因为静态函数属于类而不是属于整个对象,静态函数中的 member可能都没有分配内存。静态成员函数没有隐含的this自变量。所以,它就无法访问自己类的非静态成员。但我们在一个class中要使用CreateThread,并且需要在这个开启的线程中处理类的非静态成员变量的时候,因为CreateThread需要入口函数的地址,因此要进入类的成员函数时要求这个类成员函数是static的。那我们需在类的静态成员函数中访问非静态成员变量该怎么办呢?

一种方法是如下:

int menber;
//将上一行的非静态成员变量改写成下面所示的静态成员变量:
static int menber;

这种方法要求我们把所有要访问的成员变量都改成静态的,这样不仅不方便,而且会要求我们对类的静态成员显示初始化。有没有更好的办法呢?我们可以用给静态成员函数传递类的指针的方法来解决这个问题。方法如下:


前提是这个类要分配了内存空间。其实这里我做的就是将一个对象指针作为静态成员函数的“this”指针,意在作为传递非静态成员函数里this变量使用(在非静态成员函数中都有this指针(似乎push在ECX中))。这样,我们调用了newThread()函数后,里面新建的线程可以运行类的静态成员函数,而且通过将本对象的指针传递到这个静态成员函数里,这个函数也可以通过本对象的指针访问类的非静态成员变量。

class a
{
public:
  static FunctionA(a* _a)
  {
    _a-> menber = 1;
 cout<<_a-> menber<<endl;
 _a->f();
  }
void f()
{
 cout<<"f被调用了"<<endl;
}
void newThread()
{
   HANDLE hnd=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)FunctionA,this,0,0);
}
private:
  int menber;
};

前提是这个类要分配了内存空间。其实这里我做的就是将一个对象指针作为静态成员函数的“this”指针,意在作为传递非静态成员函数里this变量使用(在非静态成员函数中都有this指针(似乎push在ECX中))。这样,我们调用了newThread()函数后,里面新建的线程可以运行类的静态成员函数,而且通过将本对象的指针传递到这个静态成员函数里,这个函数也可以通过本对象的指针访问类的非静态成员变量。


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

C++静态成员函数访问非静态成员变量的方法 的相关文章

  • 无法打开 Python。错误 0xc000007b

    我最近一直在学习 Python 3 我在我的上网本 32 位 Windows 7 上创建简单的小程序没有任何问题 当我将它安装在我的上网本上时 我没有遇到任何问题 但现在我已经开始使用它了 我想将它安装在我的台式机上 并且我有一个 我的桌面
  • 自动从 C# 代码进行调试过程并读取寄存器值

    我正在寻找一种方法来读取某个地址的 edx 注册表 就像这个问题中所问的那样 读取eax寄存器 https stackoverflow com questions 16490906 read eax register 虽然我的解决方案需要用
  • Func 方法参数的首选命名约定是什么?

    我承认这个问题是主观的 但我对社区的观点感兴趣 我有一个缓存类 它采用类型的缓存加载器函数Func
  • FFMPEG Seeking 带来音频伪影

    我正在使用 ffmpeg 实现音频解码器 在读取音频甚至搜索已经可以工作时 我无法找到一种在搜索后清除缓冲区的方法 因此当应用程序在搜索后立即开始读取音频时 我没有任何工件 avcodec flush buffers似乎对内部缓冲区没有任何
  • SSH 主机密钥指纹与模式 C# WinSCP 不匹配

    我尝试通过 WinSCP 使用 C 连接到 FTPS 服务器 但收到此错误 SSH 主机密钥指纹 与模式不匹配 经过大量研究 我相信这与密钥的长度有关 当使用 服务器和协议信息 下的界面进行连接时 我从 WinSCP 获得的密钥是xx xx
  • 使用 Microsoft Graph API 订阅 Outlook 推送通知时出现 400 错误请求错误

    我正在尝试使用 Microsoft Graph API 创建订阅以通过推送通知获取 Outlook 电子邮件 mentions 我在用本文档 https learn microsoft com en us graph api subscri
  • 为什么 POSIX 允许在只读模式下超出现有文件结尾 (fseek) 进行搜索

    为什么寻找文件结尾很有用 为什么 POSIX 让我们像示例中那样在以只读方式打开的文件中进行查找 c http en cppreference com w c io fseek http en cppreference com w c io
  • C# 中值类型和引用类型有什么区别? [复制]

    这个问题在这里已经有答案了 我知道一些差异 值类型存储在堆栈上 而引用类型存储在托管堆上 值类型变量直接包含它们的值 而引用变量仅包含对托管堆上创建的对象位置的引用 我错过了任何其他区别吗 如果是的话 它们是什么 请阅读 堆栈是一个实现细节
  • c 中的错误:声明隐藏了全局范围内的变量

    当我尝试编译以下代码时 我收到此错误消息 错误 声明隐藏了全局范围内的变量 无效迭代器 节点 根 我不明白我到底在哪里隐藏或隐藏了之前声明的全局变量 我怎样才能解决这个问题 typedef node typedef struct node
  • 按字典顺序对整数数组进行排序 C++

    我想按字典顺序对一个大整数数组 例如 100 万个元素 进行排序 Example input 100 21 22 99 1 927 sorted 1 100 21 22 927 99 我用最简单的方法做到了 将所有数字转换为字符串 非常昂贵
  • .Net Core / 控制台应用程序 / 配置 / XML

    我第一次尝试使用新的 ConfigurationBuilder 和选项模式进入 Net Core 库 这里有很多很好的例子 https docs asp net en latest fundamentals configuration ht
  • A* 之间的差异 pA = 新 A;和 A* pA = 新 A();

    在 C 中 以下两个动态对象创建之间的确切区别是什么 A pA new A A pA new A 我做了一些测试 但似乎在这两种情况下 都调用了默认构造函数 并且仅调用了它 我正在寻找性能方面的任何差异 Thanks If A是 POD 类
  • char指针或char变量的默认值是什么[重复]

    这个问题在这里已经有答案了 下面是我尝试打印 char 变量和指针的默认值 值的代码 但无法在控制台上看到它 它是否有默认值或只是无法读取 ASCII 范围 include
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • 方法参数内的变量赋值

    我刚刚发现 通过发现错误 你可以这样做 string s 3 int i int TryParse s hello out i returns false 使用赋值的返回值是否合法 Obviously i is but is this th
  • 如何在 C# 中播放在线资源中的 .mp3 文件?

    我的问题与此非常相似question https stackoverflow com questions 7556672 mp3 play from stream on c sharp 我有音乐网址 网址如http site com aud
  • 如何连接字符串和常量字符?

    我需要将 hello world 放入c中 我怎样才能做到这一点 string a hello const char b world const char C string a hello const char b world a b co
  • 将 viewbag 从操作控制器传递到部分视图

    我有一个带有部分视图的 mvc 视图 控制器中有一个 ActionResult 方法 它将返回 PartialView 因此 我需要将 ViewBag 数据从 ActionResult 方法传递到 Partial View 这是我的控制器
  • 不同类型的指针可以互相分配吗?

    考虑到 T1 p1 T2 p2 我们可以将 p1 分配给 p2 或反之亦然吗 如果是这样 是否可以不使用强制转换来完成 或者我们必须使用强制转换 首先 让我们考虑不进行强制转换的分配 C 2018 6 5 16 1 1 列出了简单赋值的约束

随机推荐

  • 电脑宏基电脑,【宏基电脑】报价_介绍_图片_评论_咨询-宏基电脑产品大全 -真快乐商城...

    宏基电脑怎么重装系统 标签 时间 2013 10 18 10 27 10 很多朋友有这样的疑问 宏基电脑怎么重装系统 的问题 所以国美小编总结了有关宏基电脑装系统的相关知识 现在和大家一起分享 1 使用宏基电脑自带的系统光盘安装 先要在BI
  • LeetCode 2108. 找出数组中的第一个回文字符串

    给你一个字符串数组 words 找出并返回数组中的 第一个回文字符串 如果不存在满足要求的字符串 返回一个 空字符串 回文字符串 的定义为 如果一个字符串正着读和反着读一样 那么该字符串就是一个 回文字符串 示例 1 输入 words ab
  • multiprocessing.pool详解

    由于python有全局锁限制 如果想利用多核 就需要使用多进程模块 但该模块有很多坑 本篇文章记录一下其用法以及踩过的坑 一 map apply apply async对比 先贴一个对比图 引自multiprocessin pool Mul
  • CmakeList--glog

    file GLOB GLOG LIBRARIES usr lib x86 64 linux gnu libglog so set GLOG INCLUDE DIRS usr include message glog include dirs
  • 安装vb6 正在更新系统 无响应

    新装的win10系统 安装vb6时 最后一直卡在 正在更新系统 程序无响应 没办法 kill掉后 貌似不影响软件使用 但是安装vs6sp6B无法成功安装 解决办法是 不安装 数据访问 组件 参考 http bbs pcbeta com vi
  • 多路采集存储c语言程序,stm32多路巡回数据采集系统设计 含源程序

    此次设计是利用stm32开发板设计的 数据采集系统是模拟域与数字域之间必不可少的纽带 它的存在具有着非常重要的作用 本文介绍的重点是数据采集系统 而该系统硬件部分的重心在于单片机芯片 数据采集与通信控制采用了模块化的设计 数据采集与通信控制
  • qsort的自主实现

    目录 qsort 函数的功能 首先回忆一下冒泡排序是如何实现的 需要改动的地方 compare swap qosrt 函数实现 快速排序实现qsort 已经成功 今天我要分享的是qsort的自主实现 冒泡版qsort 标准是用的快速排序 好
  • Kendo UI开发教程(24): 单页面应用(二) Router 类

    Route类负责跟踪应用的当前状态和支持在应用的不同状态之间切换 Route通过Url的片段功能 url 和流量器的浏览历史功能融合在一起 从而可以支持把应用的某个状态作为书签添加到浏览器中 Route也支持通过代码在应用的不同状态之间切换
  • spring-security--基础--02--核心组件

    spring security 基础 02 核心组件 1 SecurityContextHolder 最基本的对象 它负责存储当前安全上下文信息 保存着当前用户是什么 是否已经通过认证 拥有哪些权限 默认使用ThreadLocal策略来存储
  • pandas写入读取csv文件

    1 利用Pandas把列表数据写入csv文件 具体操作封装成函数 然后直接调用就行 def insert csv datas df pd DataFrame datas file name hello df to csv csv forma
  • 这么简单,还不会使用java8 stream流的map()方法吗?

    一 前言 在日常的开发工作中经常碰到要处理list中数据的问题 比如从数据库中查出了很多学生 由于一些原因需要在内存中找出这些学生中的所有姓名 或者把名为 王五 的语文成绩暂时修改为 100 这些问题怎么处理呐 之前我们想到的是遍历每个元素
  • 图片压缩

    示例
  • [Deep Learning]——MNIST数据集

    现实生活中 银行卡识别 车牌识别 快递货号识别是很常用的功能 这些都设计到手写字识别相关的内容 手写数字数据集 MNIST 数据集大小 每张大小 28 28 共7000张图片 资料链接 https pan baidu com s 1ck1U
  • Flash of Unstyled Content (FOUC)(这个一直困惑我的迷)

    什么是FOUC 文档样式短暂失效 如果使用import方法对CSS进行导入 会导致某些页面在Windows 下的Internet Explorer出现一些奇怪的现象 以无样式显示页面内容的瞬间闪烁 这似乎不可想象 我将这种现象称之为文档样式
  • 基于Ant Design Pro下使用mock模拟本地数据

    注明 本文是在https blog csdn net qq 41139830 article details 82976282的基础上学习并记录过程 可直接点击原博主的链接进行学习 1 安装antd pro 脚手架 在使用mock模拟数据之
  • 伯恩斯坦称多边形区块链是 Web3 之王

    这家华尔街公司的一份报告称 该项目从大型全球科技公司聘请了员工 并被星巴克和 Instagram 等许多大品牌使用 伯恩斯坦周五在一份研究报告中表示 Polygon 区块链已成为将 Web2 消费者转移到 Web3 的主要门户 该系统已被星
  • 3.1.4 Hadoop, Yarn, 资源调度, AH源码分析, 3.x 新特性概述, Job三原则, 调优(Shuffle, Job, YARN, NN Full GC), 二次开发环境搭建

    目录 第七部分 YARN资源调度 第 1 节 Yarn架构 第 2 节 Yarn任务提交 作机制 第 3 节 Yarn调度策略 第 4 节 Yarn多租户资源隔离配置 第 部分 Apache Hadoop HDFS核 源码剖析 第 1 节
  • 找不到msvcp120.dll和msvcr120.dll的问题

    win11系统安装mysql5 7版本遇到找不到msvcp120 dll和msvcr120 dll的问题 因为没有安装微软常用运行库合集64位导致的 进入微软下载中心https www microsoft com zh CN downloa
  • ExtJs 修改fieldLabel的值

    修改人员选择器的fieldLabel Ext getCmp selectTreeRyName2 fieldLabel 需求定义人 Ext getCmp selectTreeRyName fieldLabel 需求定义人
  • C++静态成员函数访问非静态成员变量的方法

    静态成员函数不能访问非静态成员 这是因为静态函数属于类而不是属于整个对象 静态函数中的 member可能都没有分配内存 静态成员函数没有隐含的this自变量 所以 它就无法访问自己类的非静态成员 但我们在一个class中要使用CreateT