C++ 指向非静态成员函数的指针

2024-02-05

我读过很多关于非静态成员函数指针的帖子和答案,但看起来没有一个能够解决我的问题。
因此,我创建了一个简短的示例来复制我的问题:即使这个示例可以以不同的方式“解决”,对于最终的软件来说,保持示例中的结构很重要,谢谢。

这是“Funcs.h”类的标头:

class Funcs
{
private:
  double a = 1, b = 2;

public:
  Funcs();
  ~Funcs();
  double Fun1(double X);
  double solver(double X0);
  double aaa(double(*fun)(double), double x0);
};

这是“Funcs.cpp”类的 cpp:

#include "Funcs.h"

using namespace std;

Funcs::Funcs()
{
}

Funcs::~Funcs()
{
}

double Funcs::Fun1(double X) {
  double f1 = a*X;

  return f1;
}

double Funcs::solver(double X0)
{
  double result;

  result = aaa(Fun1, X0);
  return result;
}

double Funcs::aaa(double(*fun)(double), double x0)
{
  return fun(x0);
}

最后这是主要的“main.cpp”:

#include <iostream>
#include "Funcs.h"

using namespace std;

int main() {
  double x0=1;
  double result;
  Funcs funcs;

  result = funcs.solver(x0);
  cout << result << endl;

  return 0;
}

当我调用“result = aaa(Fun1, X0);”时,错误出现在方法 Funcs::solver 中。因为我不能使用指向 Fun1 的指针,因为它是非静态成员。同时我不能将其设为静态,否则在静态方法内部看不到变量“a”。

在此先感谢您的帮助。


问题是您试图传递一个指向成员函数的指针,而需要一个指向非成员函数或静态成员函数的指针。这些是不同的类型。

这里的“fun”是一个指向函数的指针:double(*fun)(double).

这是一个指向 Funcs 类成员函数的指针:double(Funcs::*fun)(double)

因此,您可以按照以下方法修改代码以使其正常工作。

class Funcs
{
  // all the rest is the same
  double aaa(double(Funcs::*fun)(double), double x0);
};

double Funcs::solver(double X0)
{
  // ...
  result = aaa(&Funcs::Fun1, X0);
  // ...
}

double Funcs::aaa(double(Funcs::*fun)(double), double x0)
{
  return (this->*fun)(x0);
}

查看实例在科利鲁 http://coliru.stacked-crooked.com/a/4fb8b487f046ce49.

如果您想故意限制您的方法,这可能是一个好方法aaa只接受Funcs成员函数为fun。如果您还想传递非成员函数或例如lambda 表达式为aaa,考虑使用std::function反而。

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

C++ 指向非静态成员函数的指针 的相关文章

随机推荐

  • PhpStorm 不与服务器同步

    问题是这样的 我的 phpStorm 项目使用通过 FTP 远程访问服务器 当我保存修改后的文件时 文件会正常上传到服务器 但是当我在服务器上创建文件夹时 我在 phpStorm 中看不到它 任何想法 PhpStorm 是围绕 本地项目文件
  • XACML 3.0 中的多重决策配置文件策略

    我需要为特定用户编写一个策略 它将返回如下 xacml 响应 该政策基于单用户 bob FirstName Create true Read true Update true Delete false MiddleName Create t
  • 这怎么可能:在 WaitOne 中处理 OnPaint

    我有一个ManualResetEvent 有一次 我使用等待该事件WaitOne 令我惊讶的是 我收到了一份OnPaint事件 而在WaitOne 这种情况也经常发生 堆栈跟踪如下所示 我明白了WaitOne会阻塞当前线程 并且在事件触发之
  • 如果Android中的应用程序被强制关闭,如何重置警报

    如果出现以下情况 我的应用程序使用 AlarmManager 设置的警报将被清除 用户在设置中强制关闭我的应用程序 一些任务杀手应用程序自动终止了我的应用程序进程 Android 本身杀死了我的应用程序 因为前端应用程序需要内存 请告诉我如
  • F# XML 多行文档,Visual Studio 2017

    我想添加一个多行 XML 文档 当我的鼠标悬停在它上面时 该文档将出现在 Intelli Sense 气泡中 参见示例 当我使用 Visual Studio 2015 时 以下代码可以工作 请参见下面的屏幕截图 但现在当我使用 Visual
  • 预加载组件

    在工作中 我们使用 DevExpress 作为用户界面 第一次打开使用 DevExpress 控件的表单时 会出现很长的暂停 在某些客户端上有时会出现 15 20 秒 在 Visual Studio 中 我可以看到该阶段正在加载大量程序集
  • CSS3可计算表达式?

    是否有任何技术允许在 css3 语句中使用表达式 通常 做以下事情是有帮助的 width 35 20px或类似的 目前 针对这些情况 我唯一的解决方案是重新设计页面或使用 javascript 动态设置 css CSS 关于值和单位的工作草
  • 调试类型初始值设定项中的异常

    我有一个静态类 没有静态构造函数 但有许多静态成员 第一次使用该类时 我抛出 TypeInitializationException 我正在打破 CLR 异常 并且已禁用 仅我的代码 问题是我只有在第一次使用这个类时才会得到这个异常 我不会
  • 如何在 ASP.NET MVC 5 中插入主从表

    I have Orders表和订单详细信息数据库中的表 通过 Entity Framework 6 我获得了一个模型 因此我可以从它生成类 我还从 Orders 表生成了控制器和视图 Orders folio PK date custome
  • ssl_transport_security.cc:599] 无法加载任何根证书

    我尝试使用 hyperledger composer fabric v0 19 0 创建自己的网络 网络构建似乎不错 但是当我执行composer network install 我收到这个错误 Composer Install Insta
  • 在 Spring 中使用 RestTemplate。异常 - 没有足够的变量可用于扩展

    我正在尝试访问 API 的内容 并且需要使用 RestTemplate 发送 URL String url1 http api example com Search key 52ddafbe3ee659bad97fcce7c53592916
  • XPath 在两个 HTML 注释之间进行选择?

    我有一个很大的 HTML 页面 但我想使用 Xpath 选择某些节点 div some text div div p Some more elements p div 我可以在之后选择 HTML using comment begin co
  • ImageView setImageBitmap 在 onTouch 内的复杂布局中间歇性地不执行任何操作

    我有内部包含 ImageView 的嵌套布局 这些都在 ScrollView 内 最初 ImageView 被设置为 Drawable 资源 我用这个解决方案来检测卷轴 它是从内部调用的onTouchListener Android 检测
  • openssl 命令行验证签名

    您好 我已经生成了密钥对并使用私钥生成签名 openssl rsautl sign in helloworld txt inkey aa pem out sig 但是我无法使用我的公钥验证签名 openssl rsautl verify i
  • Open XML: Word - 将所有段落标记为“Heading1”样式

    我使用Word 创建了一个带有标准normal dot 的Docx 作为测试 Hello world 级别的复杂性 我希望得到all the paragraphs其样式为 Heading1 style在Word中 我可以获取所有段落 但不知
  • 如何在 SQL Server 查询中显示表结构?

    SELECT DateTime Skill Name TimeZone ID User Employee Leader FROM t Agent Skill Group Half Hour AS t 我需要在查询中查看表结构 对于 SQL
  • numpy 数组中负数的立方根返回 nan

    来自 Numpy 文档 gt gt gt a np arange 10 3 gt gt gt a array 0 1 8 27 64 125 216 343 512 729 gt gt gt a 2 8 gt gt gt a 2 5 arr
  • 如何在php中将unicode字符转换为阿拉伯字符?

    假设该字符串是 uni str 06280628002006280628 阿拉伯语是 bab bab 那么 我如何在不使用 html 的情况下将其转换为 php for i 0 i
  • UnsupportedOperation:无法执行非零相对端搜索:Python - PyPDF2

    你们能解决这个问题吗 我无法阅读阿拉伯语 PDF 文件 我不知道是什么问题 谢谢 import PyPDF2 def main with open arabic text pdf encoding utf 8 as pdfFile pdfR
  • C++ 指向非静态成员函数的指针

    我读过很多关于非静态成员函数指针的帖子和答案 但看起来没有一个能够解决我的问题 因此 我创建了一个简短的示例来复制我的问题 即使这个示例可以以不同的方式 解决 对于最终的软件来说 保持示例中的结构很重要 谢谢 这是 Funcs h 类的标头