问题标签 [member-pointers]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
16 浏览

c++ - 将配对对象保存到/从数据文件中加载

我有两个类,A 和 B,其成员对象数据将保存在两个文本文件 A_file 和 B_file 中。A 类包括 B 类。(具体来说,A 类包含一个指向 B 类对象的指针。)我想知道如何从文件中保存和加载数据。

我假设一个类的对象需要标识号,而另一类的对象必须存储这些数字,以便正确的对象配对。(哪个类应该保存这些数字?我应该使用专用的成员变量,例如 int idnumber,或者,由于在运行时不会使用该数字,每个对象的当前内存地址就足够了吗?)

至于实际实例化对象,我认为我有三个选择:

  • 我可以先打开 A_file 并实例化 A 类对象。然后,当我打开 B_file 并实例化每个 B 类对象时,我可以将它分配给相应的 A 类对象的指针。
  • 我可以先打开 B_file 并实例化 B 类对象。然后,当我打开 A_file 并实例化每个 A 类对象时,我可以将相应的 B 类对象分配给它的指针。
  • 我可以打开这两个文件并实例化所有 A 和 B 对象,然后在完成之后将相应的 A 类对象和 B 类对象配对。(我认为这会更慢,但也许会更简单?)

顺便说一句,我无法发布实际代码,因为我正在考虑如何在编写任何代码之前构建这样的程序。我想知道是否有任何常见的最佳实践,或者是否有什么可以接受的,这真的取决于。TIA。

0 投票
0 回答
51 浏览

c++ - 将全局模板函数实现为访问成员的成员函数

免责声明:我知道有十几种更好的方法来实现以下内容,但我这样做是为了了解更多关于模板和成员指针的信息。我正在和他们一起玩,我想看看以下是否可行。

我想要一个用作非静态成员函数的非成员模板函数。不同的类可以自己实现它并设置函数影响哪些数据成员。

在示例中,我制作了模板函数add10ToMember,这是一个将给定成员加 10 的简单函数。

一旦我实例化DoubleHolderor的对象IntHolder,编译就会失败并且我得到的错误是:“'*': 'int IntHolder::* '”类型的操作数非法,“'+=': 非法,左操作数有类型'int IntHolder::* '"。

我明白为什么会出现错误:add10ToMember实际上不知道应该对哪个DoubleHolderIntHolder它执行操作。add10ToMember<IntHolder, int, &IntHolder::value>不会成为实际的成员函数;它仍然只是一个对非给定IntHolder实例有影响的全局函数。

但我只是不明白写我想要的东西的正确方法是什么,如果不是这样的话。甚至可能吗?

0 投票
3 回答
277 浏览

c++ - 什么是模板意思是?

我正在阅读这个史前元程序示例来检测一个类是否支持成员查找。(或任何其他成员)。

直觉上我确实理解这背后的目的,但如果有人让我在 10 天后从头开始写同样的东西,我可能会失败。
原因是我不完全理解这里使用的句法和语言延伸。
有人可以解释以下语法的含义吗?

  1. Check<int Fallback::*, &U::find>* (我知道它在这里试图从 SFIAN 中受益,但是这是如何检测到 find 的存在,我相信这也与第二个问题有关)
  2. template<typename U, U> struct Check;

程序按预期输出 0 1 ;

0 投票
3 回答
61 浏览

c++ - 为什么虽然没有对象,但启用了结构数据成员的打印地址?

假设我有以下代码。我原以为这至少要给我一个警告。

然而,我惊讶地发现这段代码编译时没有任何抱怨。所以我想知道,这种情况下实际打印的是什么,是怎么test::whatever存储的,所以我们可以访问它的地址?

0 投票
2 回答
301 浏览

c++ - 指向成员函数的指针执行虚拟调度?

我执行了以下代码。

我的预期输出是Base func called. 然而,相反,输出是

这让我感到惊讶,因为我认为func_ptr应该只能看到Base成员(因为我认为它func_ptr不会通过 访问成员函数_vptr,而是函数地址本身。

我想知道,在这种情况下虚拟调度是如何发生的(如何访问虚拟表),以及这种行为在 C++ 标准中定义的位置(我什么都找不到)?

0 投票
0 回答
122 浏览

pointers - 在 Delphi 的泛型函​​数中分配对象的指针函数属性 - 为什么这段代码有效?

我已经有 20 多年没有使用 Delphi Pascal 编程了。当前的挑战是以或多或少的 OOP 方式在 Pascal 中包装 C 共享库 API。

我使用的模式是运行时的惰性绑定,即加载库和链接到函数是按需执行的。Pascal 端 API 被声明为具有许多指定类型的函数指针成员的对象 - 每个成员都GetProcAddress通过适当的后检查初始化为 's 结果。

我决定包装代码中最烦人和重复的部分,即按名称获取地址、分配、检查结果、检索错误消息并在 Pascal 泛型中报告结果。使用 C++ 模板可以轻松完成的事情在 Pascal 中出现了自己的挑战:

  1. 作为泛型参数的Pointer类型使用似乎受到限制。
  2. 没有简单的方法可以将简单(不是对象成员)函数指针转换为无类型指针或从无类型指针转换。

我找到的唯一可行的解​​决方案如下:

它在如下使用时起作用:

我不想说:我不完全理解它为什么起作用。而且我不喜欢我不完全理解的代码。

  • 指向对象成员变量的指针作为第一个参数传递。
  • 在我看来,参数的类型应该是指向函数的指针。
  • 后来我计划取消对它的引用并将一个获取的函数地址分配给它的值转换为NativeUInt. 不过,它起作用的唯一方法是将指针指向函数的指针转换为PNativeUInt,并将获取的函数地址转换为PNativeUInt返回给它。根据我的理解,它应该更改了指向指针的值,而不是它指向的指针。但不知何故,尽管很明显,它确实改变了指向的价值。

任何具有现代 Pascal 知识的人都可以向我解释我的代码中发生了什么吗?

0 投票
1 回答
106 浏览

c++ - 了解指向类型类成员的指针 - 无多态性

我认为如果BaseT是 DerivedT 的基础,那么“指向DerivedT 类型的 T 类成员的指针”可以用作“指向 BaseT 类型 T 的成员的指针”,这很简单。类比似乎至少对我来说是显而易见的,因为DerivedT * 可以用作BaseT *,所以DerivedT T:: * 应该能够用作BaseT T:: *

但事实并非如此:

正如我所见,有两种方法可以解释指向类成员的指针:

  1. DerivedT T:: * 是一个DerivedT指针,它指向T类对象内部的DerivedT对象(因此指向一个相对于另一个对象的对象)
  2. DerivedT T:: * 指向类T对象的某个部分,顺便说一下,它具有DerivedT类型。

所以这两种方式的主要区别在于,第一种可以解释为一种DerivedT指针(启用多态),而后一种丢弃了类型并限制了很多使用。

为什么 C++ 选择第二种方法?启用使用DerivedT T:: * 作为BaseT T:: *可能会产生什么不良后果?在实践中指向成员的指针是什么?

更新: 我想实现以下目标: 所需的解决方案 但如果成员不是 BaseMember 类型而是 BaseMember 后代,则它不起作用。如果我使用 BaseMembers,则该概念有效(但在这种情况下,我无法实现所需的成员功能): 适用于损坏的功能

更新 2:为什么
TLDR:
一种编译时间“标记”(唯一标识)运行时构造类的非静态成员对象的方法。然后检查一个常规(非成员)指针是否在具有
1的运行时函数中被编译时标记,标记成员的编译时间数组(可以是任何东西,在我看来是指向成员的多态指针)
2. 包含对象(具有标记和未标记成员)的“this”指针
3,指向非静态成员对象的常规(非指向成员)指针。

时间轴:类定义(编译时)->添加类成员(编译时)->将类成员标记为启用-例如在数组中-(编译时)->构造(运行时)->成员将调用注册函数(运行时) -> 在注册函数中,我们需要检查调用者(我们将其作为常规指针接收)是否允许调用此函数(运行时)。

详细描述:
在一个库中,我有一个 CRTP 基类(DataBinding),如果用户想使用它的编译和运行时功能,他们应该继承它。然后在库中我还有一个接口类:BaseMember,以及它的许多派生类。最终用户可以使用派生类在其用户定义的 DataBinding 子类中添加非静态类成员对象。

在用户代码中,在 DataBinding-descendant 用户类中,用户可以拥有基于 BaseMember 的非静态类成员。这里出现了需要指向成员多态性的新功能:用户应该能够在编译时标记一些基于 BaseMember 的类成员(!)(类本身没有 constexpr 构造函数) - 在我看来'mark' 可以存储指向 BaseMember 后代成员对象的成员的指针,并且只应允许标记的对象在 DataBinding(当前类的 CRTP 基)中运行时调用类成员函数(registerMember)。

在 registerMember 运行时函数中,我有“this”对象指针(包含对象),我有编译时用户定义的列表,它标记了启用的指向成员的指针(它可以用任何类型的唯一标识替换),我有实际的成员指针。我需要检查是否允许实际的成员指针调用该函数(它被标记为编译时间)。

0 投票
1 回答
52 浏览

c++ - 如何从类指针和指向 C++ 成员的普通指针中获取成员指针?

我可以像示例中那样获得指向对象实例成员的普通指针。我怎样才能在相反的方向做到这一点?

从技术上讲,它必须是可能的,因为对象和实例上的成员之间的区别在于成员指针。虽然我不知道正确的语法。