在成员函数中测试 this 指针在 C++ 中合法吗?

2023-12-10

我有一个涉及不同类类型的对象的应用程序。对象由指针引用。空指针表示关联的对象不存在。目前调用代码很麻烦,因为每次使用指向对象的指针时,都会测试指针值是否为空,并采取一些适当的操作来判断是否为空。因为在不存在的情况下要采取的默认操作取决于对象的类型,所以我更愿意将其编码在对象本身的类中,而不是在调用程序中。这会产生如下结构:

class C
{ ... 
  void member_func() //non-virtual !
  { if (this) { do something with the object ... }
    else { take some default action }
  }
  ...
};

显然成员函数不能是虚的,因为当对象不存在时查找表也不存在,虚调用就会失败。但是这段代码对于非虚拟成员函数来说是合法的 C++ 吗?对于我尝试过的编译器来说,它似乎可以正常工作,但我担心可能的不可移植性。在标准中我找不到明确允许或明确禁止此类结构的条款。


this在成员函数中永远不会为空,因此您执行的检查是无用的。

正如 Matthieu M. 在评论中指出的,如果您在代码中执行以下操作:

C* c = 0; 
c->member();

这会导致未定义的行为那就是bad.

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

在成员函数中测试 this 指针在 C++ 中合法吗? 的相关文章

  • 如何从 C# 中的 dataTable.Select( ) 查询中删除单引号?

    所以我有一个经销商名称列表 我正在我的数据表中搜索它们 问题是 一些傻瓜必须被命名为 Young s 这会导致错误 drs dtDealers Select DealerName dealerName 所以我尝试替换字符串 尽管它对我不起作
  • 使用 C# 登录《我的世界》

    我正在尝试为自己和一些朋友创建一个简单的自定义 Minecraft 启动器 我不需要启动 Minecraft 的代码 只需要登录的实际代码行 例如 据我所知 您过去可以使用 string netResponse httpGET https
  • 以编程方式读取 SQL Server 查询计划建议的 SQL 特定执行的索引?

    如果我在 SSMS 中运行此命令 set showplan xml on GO exec some procedure arg1 arg2 arg3 GO set showplan xml off GO 我获得查询执行中涉及的完整调用堆栈的
  • 查找进程的完整路径

    我已经编写了 C 控制台应用程序 当我启动应用程序时 不使用cmd 我可以看到它列在任务管理器的进程列表中 现在我需要编写另一个应用程序 在其中我需要查找以前的应用程序是否正在运行 我知道应用程序名称和路径 所以我已将管理对象搜索器查询写入
  • 如何填充 ToolStripComboBox?

    我发现它很难将数据绑定到ToolStripComboBox 好像没有这个ValueMember and DisplayMember特性 怎么绑定呢 访问toolstripcombobox中包装的组合框并访问其ValueMember Disp
  • Visual Studio 在构建后显示假错误

    我使用的是 Visual Studio 2017 构建后 sln在调试模式下 我收到错误 但是 当我通过双击错误列表选项卡中的错误来访问错误时 错误会从页面中消失 并且错误数量也会减少 我不太确定这种行为以及为什么会发生这种情况 有超过 2
  • 使用可变参数包类型扩展的 C++ 函数调用者包装器

    我绑定了一些 API 并且绑定了一些函数签名 如下所示 static bool WrapperFunction JSContext cx unsigned argc JS Value vp 我尝试将对象和函数包装在 SpiderMonkey
  • unordered_map 中字符串的 C++ 哈希函数

    看起来 C 标准库中没有字符串的哈希函数 这是真的 在任何 c 编译器上使用字符串作为 unordered map 中的键的工作示例是什么 C STL提供模板专业化 http en cppreference com w cpp string
  • File.AppendText 尝试写入错误的位置

    我有一个 C 控制台应用程序 它作为 Windows 任务计划程序中的计划任务运行 此控制台应用程序写入日志文件 该日志文件在调试模式下运行时会创建并写入应用程序文件夹本身内的文件 但是 当它在任务计划程序中运行时 它会抛出一个错误 指出访
  • 告诉 Nancy 将枚举序列化为字符串

    Nancy 默认情况下在生成 JSON 响应时将枚举序列化为整数 我需要将枚举序列化为字符串 有一种方法可以通过创建来自定义 Nancy 的 JSON 序列化JavaScript 原始转换器 https github com NancyFx
  • 在视口中查找 WPF 控件

    Updated 这可能是一个简单或复杂的问题 但在 wpf 中 我有一个列表框 我用一个填充数据模板从列表中 有没有办法找出特定的数据模板项位于视口中 即我已滚动到其位置并且可以查看 目前我连接到了 listbox ScrollChange
  • 等待 IAsyncResult 函数直至完成

    我需要创建等待 IAsyncResult 方法完成的机制 我怎样才能做到这一点 IAsyncResult result contactGroupServices BeginDeleteContact contactToRemove Uri
  • 检测到严重错误 c0000374 - C++ dll 将已分配内存的指针返回到 C#

    我有一个 c dll 它为我的主 c 应用程序提供一些功能 在这里 我尝试读取一个文件 将其加载到内存 然后返回一些信息 例如加载数据的指针和内存块的计数到 c Dll 成功将文件读取到内存 但在返回主应用程序时 程序由于堆损坏而崩溃 检测
  • WPF DataGridTemplateColumn 组合框更新所有行

    我有这个 XAML 它从 ItemSource 是枚举的组合框中选择一个值 我使用的教程是 http www c sharpcorner com uploadfile dpatra combobox in datagrid in wpf h
  • 在屏幕上获取字符

    我浏览了 NCurses 函数列表 似乎找不到返回已打印在屏幕上的字符的函数 每个字符单元格中存储的字符是否有可访问的值 如果没有的话Windows终端有类似的功能吗 我想用它来替换屏幕上某个值的所有字符 例如 所有a s 具有不同的特征
  • String.Empty 与 "" [重复]

    这个问题在这里已经有答案了 可能的重复 String Empty 和 有什么区别 https stackoverflow com questions 151472 what is the difference between string
  • 使用 omp_set_num_threads() 将线程数设置为 2,但 omp_get_num_threads() 返回 1

    我有以下使用 OpenMP 的 C C 代码 int nProcessors omp get max threads if argv 4 NULL printf argv 4 s n argv 4 nProcessors atoi argv
  • GCC 的“-Wl,option”和“-Xlinker option”语法之间有区别吗?

    我一直在查看一些配置文件 并且看到它们都被使用 尽管在不同的体系结构上 如果您在 Linux 机器上使用 GCC 将选项传递给链接器的两种语法之间有区别吗 据我所知 阅读 GCC 手册时 他们的解释几乎相同 From man gcc Xli
  • Objective-C / C 给出枚举默认值

    我在某处读到过关于给枚举默认值的内容 如下所示 typedef enum MarketNavigationTypeNone 0 MarketNavigationTypeHeirachy 1 MarketNavigationTypeMarke
  • 如何将十六进制字符串转换为无符号长整型?

    我有以下十六进制值 CString str str T FFF000 如何将其转换为unsigned long 您可以使用strtol作用于常规 C 字符串的函数 它使用指定的基数将字符串转换为 long long l strtol str

随机推荐

  • 有限制的 OWL 类型推断

    我正在使用 FaCT 和一个简单的本体研究 Protege 4 的 OWL 限制概念 假设我有一个人foo班级的Something Something a owl Class foo a Something owl NamedIndivid
  • SAPUI5 智能表:如何将我自己的列注入智能表、默认列、定义格式化程序和定义聚合列

    我正在使用智能表 我想了解以下有关此事的信息 如何使某些列默认可见 我们如何将自己的列注入到智能表中 比如我们想显示 基于性别 男性或女性 的图标 我们如何设置聚合列 例如名称 名字 姓氏 如何定义聚合列的排序和过滤 XML View
  • 从 gridview 中删除行

    我有 2 个表 MachineGroups 和 Machines MachineGroups 有列 MachinegroupID MachineGroupName MachineGroupDesc 机器有专栏 MachineGroupID
  • 如果特定命令失败,请勿中止脚本

    我正在运行我的脚本 bin bash eu 每当出现问题时 就会根据需要中止脚本 但有时我预计其中一个命令最终会失败 我想告诉bash忽略失败条件 在make您可以使用以下命令忽略一个命令的状态 command 有类似的东西吗bash 唯一
  • 如何将c/c++编译为ms-dos .com程序?

    我将 Code Blocks 与 GNU GCC 编译器一起使用 我的问题是 有没有办法将 c c 代码编译为 ms dos 16 位 com 可执行格式 我尝试设置构建选项并在网上搜索编译器参数 但我找不到任何东西 您当然可以将 C 和
  • 地理定位 SQL 查询未找到确切位置

    我已经测试我的地理位置查询一段时间了 直到现在我还没有发现任何问题 我试图搜索给定半径内的所有城市 通常我会使用该城市的坐标来搜索该城市周围的城市 但最近我尝试在一个城市周围搜索 发现城市本身没有返回 我的数据库中有这些城市的摘录 city
  • Java SQL 日期偏差 1 天

    我正在使用与我位于同一时区的 MySQL 服务器 我试图将 java util Date 插入数据库中的类型列DATE使用以下代码 SimpleDateFormat dateFormat new SimpleDateFormat yyyy
  • 使用鼠标在 python tkinter 画布上绘制并获取指向列表的点?

    我正在使用 tkinter 开发 Python 应用程序 我想要做的是在画布坐标上绘制 并将点记录到列表中 以便稍后进行计算 如果不可能 您会推荐任何其他可以做到这一点的工具或 GUI 平台吗 编辑 到目前为止 我拥有的是一个可以从列表中获
  • 从角色授权更改为声明授权

    我有一个使用 ASP NET 会员资格构建的 Web 表单应用程序 我成功迁移到身份 我现在想使用Claims授权而不是Roles授权 但是老用户的Role信息已经迁移到了AspNetUserRoles数据库中的表 但AspNetUserC
  • 在服务器上找不到路径错误的一部分

    我想每天运行一个调度程序 所以我创建了一个Windows application并将其存储到服务器上 这在我的本地计算机上工作正常 但我收到路径错误 找不到路径的一部分 C Windows System32 有了这个 我认为可能存在一些与路
  • @Autowired 与 JUnit 测试

    我使用了 JUnit 但有些测试存在一些问题 这些测试在 Spring bean 内有 Autowired 注释 当我引用它们时 Autowired 的 bean 始终为 NULL 这是示例代码 public class Test prot
  • 如何将矩阵的索引映射到一维数组(C++)?

    我有一个 8x8 矩阵 如下所示 char matrix 8 8 另外 我有一个包含 64 个元素的数组 如下所示 char array 64 然后我将矩阵绘制为表格 并用数字填充单元格 每个数字从左到右 从上到下递增 例如 如果我在矩阵中
  • StackOverflow 对标签弹出窗口使用什么类型的动画? [关闭]

    Closed 这个问题是无关 目前不接受答案 有谁知道 Stackoverflow 的标签弹出窗口使用什么类型的 jQuery 动画 我所说的标签弹出窗口是指当您将鼠标悬停在 Stackoveflow 中的标签上时 会出现一个弹出窗口 动画
  • 将列号转换为字母的函数?

    有谁有可以从数字返回列字母的 Excel VBA 函数吗 例如 输入100应该返回CV 此函数返回给定列号的列字母 Function Col Letter lngCol As Long As String Dim vArr vArr Spl
  • Google Sheets:自定义函数中的日期格式

    我在谷歌表格中有以下自定义函数 我尝试在自定义函数中调用内置函数 TEXT 但没有成功 Google表格会提示 未知 功能 TEXT 有解决办法吗 function NextMonth StockTradeDate var DeltaDat
  • 通用应用程序 Windows Phone 方向

    最近 我正在为 Windows Phone 和 Windows Store 开发一个通用应用程序 在该应用程序中 我试图将应用程序的方向修复为横向 但在 Windows Phone 8 1 的基于 WinRT 的应用程序中 我找不到任何方向
  • 如何在 vim cscope 结果窗口中搜索

    当我们使用 cscope 去 vim 中定义一个符号时 结果窗口中可能会显示很多候选符号 我想在窗口内进行搜索以快速找到我需要的内容 但是搜索功能 在结果窗口中似乎不起作用 只有几个键可用 j k gg G等 无论如何可以在 cscope
  • 根据正则表达式匹配对字符串列表进行排序

    我有一个看起来有点像的文本文件 random text random text can be anything blabla A blabla random text random text can be anything blabla D
  • cakephp - 如何处理完整性约束违规错误

    我在这里不知所措 我需要知道如何在违反完整性约束的情况下处理错误消息 意思是我想向用户显示一些有意义的消息 而不是显示错误消息 例如 Error SQLSTATE 23000 Integrity constraint violation 1
  • 在成员函数中测试 this 指针在 C++ 中合法吗?

    我有一个涉及不同类类型的对象的应用程序 对象由指针引用 空指针表示关联的对象不存在 目前调用代码很麻烦 因为每次使用指向对象的指针时 都会测试指针值是否为空 并采取一些适当的操作来判断是否为空 因为在不存在的情况下要采取的默认操作取决于对象