问题标签 [member-functions]

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 投票
12 回答
3044 浏览

c++ - 指向成员函数的指针的实际用途是什么?

我已经阅读了这篇文章,我从中得到的是,当你想调用一个指向成员函数的指针时,你需要一个实例(指向一个或堆栈引用的指针)并这样调用它:

我的问题是基于这个:既然你实例,为什么不直接调用成员函数,像这样:

指向成员函数的指针的合理/实际用途是什么?

[编辑]

我正在玩 X-development 并达到了我正在实现小部件的阶段;当事件到达时,用于将 X 事件转换为我的类和小部件的事件循环线程需要为每个小部件/窗口启动线程;为了正确地做到这一点,我认为我需要指向我的类中的事件处理程序的函数指针。

不是这样:我发现我可以通过简单地使用虚拟基类以更清晰、更整洁的方式做同样的事情。不需要指向成员函数的指针。正是在开发上述内容时,出现了对成员函数指针的实际可用性/意义的怀疑。

您需要一个实例的引用才能使用成员函数指针这一简单的事实已经过时了。

[编辑-@sbi & 其他]

这是一个示例程序来说明我的观点:(特别注意'Handle_THREE()')


{edit]上面示例中直接调用的潜在问题
在 Handler_THREE() 中,方法的名称必须是硬编码的,强制在使用它的任何地方进行更改,以将任何更改应用于方法。使用指向成员函数的指针唯一要做的额外更改是创建指针的位置。

[编辑]从答案中收集到的实际用途:来自 Chubsdad 的回答

什么
专用的“调用者”函数用于调用 mem-func-ptr;
好处:使用其他对象提供的函数来保护代码
如何:如果特定函数在许多地方使用并且名称和/或参数发生变化,那么您只需将其分配的名称更改为指针,并在“调用者”函数中调整调用。(如果该函数用作 instance.function() 则必须在任何地方进行更改。)

来自Matthew Flaschen 的回答
什么:类中的局部特
化 好处:使代码更清晰、更简单、更易于使用和维护
如何:用(可能)大型 switch()/if 替换通常使用复杂逻辑实现的代码-then 直接指向特化的语句;与上面的“调用者”功能非常相似。

0 投票
4 回答
1323 浏览

c++ - 如何在编译时判断类是否包含某个成员函数

可能重复:
是否可以编写 C++ 模板来检查函数是否存在?

说有2个类:

我想在以下函数中使用 A 或 B 类型的对象

现在,因为有一大堆类,有些包含 GetInt(),有些不包含,我不想为每种类型编写专门化,我只想在编译时通过 ' 是否包含 GetInt()来区分它们',我该怎么做?

0 投票
3 回答
2692 浏览

c++ - 成员函数模板的放置位置

C++ 中经常让我感到沮丧的一个方面是决定模板在头文件(传统上描述接口)和实现 (.cpp) 文件之间的位置。模板通常需要放在头文件中,公开实现,有时还需要引入额外的头文件,这些头文件以前只需要包含在 .cpp 文件中。我最近又遇到了这个问题,下面是一个简化的例子。

请注意,我打算使用我的实际类作为基类,因此是虚拟析构函数;我怀疑这很重要,但我把它留在柜台以防万一。上面的结果输出是

NowCounter的类声明都可以放在头文件中(例如,counter.h)。我可以把需要iostream的dtor的实现放到counter.cpp中。但是对于countAndPrint()同样使用 iostream 的成员函数 template 怎么办?它在 counter.cpp 中没有用,因为它需要在已编译的 counter.o 之外进行实例化。但是将它放在 counter.h 中意味着包括 counter.h 在内的任何内容也反过来包含 iostream,这似乎是错误的(我接受我可能只需要克服这种厌恶)。我也可以将模板代码放到一个单独的文件中(counter.t?),但这对于代码的其他用户来说有点令人惊讶。Lakos并没有像我想要的那样深入探讨这个问题, C++ 常见问题解答没有进入最佳实践。所以我追求的是:

  1. 是否有任何替代方法可以将代码划分为我建议的代码?
  2. 在实践中,什么最有效?
0 投票
2 回答
13320 浏览

c++ - C++:从类外部访问公共成员函数

我在一个单独的文件中定义了一个类,有时我需要从另一个源文件访问其中一个公共成员函数。出于某种原因,我忘记了如何做到这一点,编译器给了我一个错误。

我有 classA.h ,其 A 类的定义与此类似:

以及一个带有实现的单独文件 classA.cpp。然后在其他一些文件 blah.cpp 中,我包含标题并尝试像这样访问它:

我的编译器拒绝它,错误是找不到“classA::function1(int)”的匹配项。
如果这很重要,我会使用 Embarcadero RAD studio 2010。

0 投票
4 回答
106 浏览

c++ - 如何在类方法中创建即时相关的静态变量?

我在一个类中有一个函数,或多或少像这样工作:

尝试使用多个播放器时会出现问题,如下所示:

o1playerone.minions[0]正如预期的那样,位于 中,但是,位于o2playerthree.minions[1]Summon()函数使用相同的i变量。有没有办法让函数对单个实例Summon()使用静态变量,但对每个实例使用单独的变量?我知道我可以做一个循环到等于的第一个点,或者直接做一个成员,但我想知道在我做这些之前是否有更好的方法。iiforminions[]NULLiPlayer

0 投票
4 回答
22839 浏览

javascript - 如何列出 javascript 对象的函数/方法?(这甚至可能吗?)

这个问题是故意用这个问题来表述

我什至不知道这是否可能,我记得隐约听到一些关于 JS 中无法枚举的属性。

无论如何,长话短说:我正在一个 js 框架上开发一些东西,我没有文档也无法轻松访问代码,这将极大地帮助了解我可以用我的对象做什么。

0 投票
1 回答
748 浏览

c++ - 如何声明一个朋友是另一个尚未在 C++ 中定义的类的成员函数?

我如何将 B 的构造函数声明为 A 的朋友?我试过:

0 投票
3 回答
3642 浏览

c# - 在 C# 中有没有办法通过插件覆盖私有或公共函数?

我有一个加载插件的应用程序。我有一个可以完全访问表单实例的插件。如果我有一个需要覆盖但不是虚函数的形式的函数,是否有另一种方法来覆盖它?

这是一个非常通用的示例:

...然后在一个单独的 dll 中...

在此示例中,表单中的函数设置了“myVariable1”,但插件中的“setVar”函数设置了“myVariable2”。

所以,问题是,在这个例子中,我可以用插件中的函数替换/覆盖表单的“setVar”函数吗?也许有信息或反思?

0 投票
1 回答
1435 浏览

c++ - 使用 thiscall 约定调用 C++ 成员函数

我有一个用 C++ 编写的应用程序,它加载我用 Delphi 编写的 DLL。应用程序调用 DLL 的导出函数并将指针传递给一个类的对象,该类具有我想从我的 Delphi DLL 调用的几个成员函数。我编写了一个与 C++ 类等效的 Delphi 类:

和 C++ 类看起来一样

成员函数使用没有 Delphi 等效的 thiscall 调用约定。这可能意味着我需要使用汇编。我试过了:

但是当应用程序调用此函数时出现分段错误。如何正确调用成员函数?

0 投票
9 回答
5691 浏览

c++ - 非静态成员作为非静态成员函数的默认参数

谁能给我一个理由来解释为什么这在 C++ 中是非法的?!也就是说,我知道这是一个错误,我知道这个错误是什么意思,我就是不明白为什么这会是非法的!