Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在c++中的静态成员函数中使用指向成员函数的指针

如何在c++中的静态成员函数中使用指向成员函数的指针
EN

Stack Overflow用户
提问于 2021-07-13 12:30:05
回答 3查看 78关注 0票数 1

我实际上是想在一个静态函数中使用一个指针,它和我试图在指针中使用的函数在同一个类中。实际上,我被要求这样使用这个类:

代码语言:javascript
运行
AI代码解释
复制
class Factory {
    public:
        Factory() = default;
        ~Factory() = default;
        static IOperand* createOperand(eOperandType type, const std::string& value);
    private:
        IOperand* createInt8(const std::string& value);
        IOperand* createInt16(const std::string& value);
        IOperand* createInt32(const std::string& value);
        IOperand* createFloat(const std::string& value);
        IOperand* createDouble(const std::string& value);
        IOperand* createBigDecimal(const std::string& value);
};

如果这个函数不是静态的,我会这样做:

代码语言:javascript
运行
AI代码解释
复制
IOperand* Factory::createOperand(eOperandType type, const std::string& value)
{
    IOperand* (Factory::*ptr[6])(const std::string&) = {
            &Factory::createInt8,
            &Factory::createInt16,
            &Factory::createInt32,
            &Factory::createFloat,
            &Factory::createDouble,
            &Factory::createBigDecimal
    };
    return (*this.*ptr[type])(value);
}

ps: eOperandType只是一个枚举

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-07-13 12:39:18

无论在何处使用成员函数指针调用方法,都需要一个对象来执行此操作。在你的“如果这个函数不是静态的,这就是我该怎么做”版本中,你在当前对象this上调用方法。在静态方法中,您需要一个Factory类型的不同对象,因为静态方法中没有this。我怀疑实际上Factory的所有方法都应该是static的,尽管不涉及到这一点,但您可以这样做:

代码语言:javascript
运行
AI代码解释
复制
struct IOperand {};
class Factory {
    public:
        Factory() = default;
        ~Factory() = default;
        static IOperand* createOperand(size_t type, const std::string& value) {
            Factory f;
            IOperand* (Factory::*ptr[6])(const std::string&) = {
                &Factory::createInt8,
                &Factory::createInt16,
                &Factory::createInt32,
                &Factory::createFloat,
                &Factory::createDouble,
                &Factory::createBigDecimal
            };
            return (f.*ptr[type])(value);
        }
    private:
        IOperand* createInt8(const std::string& value);
        IOperand* createInt16(const std::string& value);
        IOperand* createInt32(const std::string& value);
        IOperand* createFloat(const std::string& value);
        IOperand* createDouble(const std::string& value);
        IOperand* createBigDecimal(const std::string& value);
};
票数 1
EN

Stack Overflow用户

发布于 2021-07-13 12:35:38

您需要知道应该在何处调用其成员函数的对象。

你如何知道它并不重要,关键是你必须以某种形式或方式知道它。可能会将指向对象的指针作为附加参数传递:

代码语言:javascript
运行
AI代码解释
复制
IOperand* Factory::createOperand(Factory *obj, eOperandType type, const std::string& value)
{
    IOperand* (Factory::*ptr[6])(const std::string&) = {
            &Factory::createInt8,
            &Factory::createInt16,
            &Factory::createInt32,
            &Factory::createFloat,
            &Factory::createDouble,
            &Factory::createBigDecimal
    };
    return ((*obj).*ptr[type])(value);
}

或者,可能是传入了对对象的引用,而不是指针(导致对代码的轻微调整),或者可能对象位于完全不同的位置。也许createOperand()会调用其他函数,返回指向其类实例的指针或引用,但重点是成员函数不能由其自身调用。调用其成员函数的对象是必需的。这就是成员函数的含义,以及它与普通函数的区别。

附言:这一切是否都在“静态成员函数中”并不重要。这不是一个因素。唯一的因素是,在非静态成员中,您始终将this作为可用对象。但是没有法律要求你通过指针来调用this的成员,如果你在某个地方有同一个类的其他实例,你可以调用它的成员函数,而不是this one的成员函数。

票数 1
EN

Stack Overflow用户

发布于 2021-07-13 13:16:31

感谢大家的回答,我现在对这个主题和我的项目工作有了更好的理解。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68362450

复制
相关文章
最新ionic-cli创建ionic3而非ionic4的项目
在ionic CLI v4.8.0版本创建项目时,会询问是创建ionic3还是ionic4项目,然而更新到 ionic CLI v4.10.2(latest)时,这个询问提示消失了,直接默认创建ionic3项目,而且看参数是没有创建ionic3项目支持的,于是,我上Github发了个issue: How to create ionic3 project by ionic CLI v4.10.2(latest)
IT晴天
2019/03/06
1.5K0
Ionic安装环境安装关于墙国环境创建Ionic项目测试运行项目
环境安装 先安装Node.js,网址 www.nodejs.org 下载地址是:https://nodejs.org/en/download/current/, 如果不是请自行在官网上查找。安装一路
孙亖
2018/06/06
1.3K0
Wordpress显示所有文章
使用下面loop只能展示当前分类下的文章 <?php if(have_posts()): ?> <?php while(have_posts()):the_
切图仔
2022/09/14
7590
Flutter 应用程序中显示应用程序通知
要使用 Overlay 功能,我们必须将 Material 应用程序包装在OverlaySupport小部件中。
徐建国
2021/11/30
1.8K0
Flutter 应用程序中显示应用程序通知
[前端][ionic2]ionic2项目环境搭建
最开始用npm安装ionic,记得把npm升级一下到最新版本。npm install –g ionic 记得要全局安装。
Tuzei
2020/03/16
4880
Ionic用于构建跨平台移动应用程序的开源框架
Ionic框架和小程序容器技术可以结合使用,以在小程序平台上构建跨平台移动应用程序。通过将Ionic应用嵌套在小程序的WebView中或利用小程序桥接插件实现与小程序环境的通信,开发者可以在小程序平台上利用Ionic框架提供的跨平台开发能力和丰富的用户界面组件。这种结合为开发者提供了更多选择和灵活性,能够同时享受到Ionic框架和小程序平台的优势。 Ionic是一个用于构建跨平台移动应用程序的开源框架。它结合了HTML、CSS和JavaScript等技术,帮助开发者创建具有原生应用体验的移动应用程序。Ionic提供了一套用户界面组件和工具,可用于构建高度交互和美观的移动应用界面。
菜特鸡鼻涕
2023/06/25
3870
【初探IONIC】不会Native可不可以开发APP?
前言 Hybrid技术流行已经有一段日子了,楼主的关注点也一直围绕着移动端围绕着Hybrid相关展开,Hybrid已经是大大提升开发效率的开发方式了,但是仍然需要至少一个IOS与Andriod,那么可不可以只使用H5相关的知识就能做一个APP出来呢?答案是可以的。 什么是cordova? cordova为一移动开发框架,他让我们可以仅仅专注前端代码,然后通过一个开发框架编译形成一个可安装的APP,因为前端代码的特性,所以这种APP是跨平台的,可以最大程度的提升开发效率,因为只需要前端人员,其成本节约也是不可
逸鹏
2018/04/10
2.4K0
【初探IONIC】不会Native可不可以开发APP?
ionic这几天无法创建项目的分析说明
原来ionic-cli执行ionic start 时,获取github上的项目模版到本地,再执行npm install,但随着ionic3已经稳定了,为不占用ionic4的资源,也便于较快下载模版,模版压缩成tar.gz存放到别处——当前是放在https://d2ql0qc7j8u4b2.cloudfront.net上,所以如果下载不了,先看看能不能访问该网站。
IT晴天
2018/08/20
8400
Ionic 开发之 Ionic Storage 详解
Ionic Storage 是一款基于 localForage 用于 Ionic 应用程序的简单 “键-值” 存储模块,支持 SQLite 开箱即用。该工具可以根据平台自动选择最佳的存储引擎,而不用用户关系具体的使用细节。模块内存储引擎的默认选择顺序是 SQLite,IndexedDB,WebSQL 和 LocalStorage。
阿宝哥
2019/11/06
4K0
【组件篇】ionic3均分列等宽高图像显示(下)
那就是它依赖一个addImage(用于添加的仿按钮图像),如果我没有这个东西,逻辑上是不是就不能用了?是的!那为了使得这个组件能更通用些,改造一下:
IT晴天
2018/08/20
4550
Ionic 2 项目结构./src/index.html./src/./src/app/app.html
解剖Ionic 2 app。进入项目创建的文件夹,这里有一个典型的Cordova项目结构,我们可以安装原生插件,创建平台定义工程文件。 ./src/index.html src/index.html是app的主入口, 设置脚本和CSS,引导、启动我们的应用。对于app的应用,Ionic在HTML中寻找<ion-app>标签。 <ion-app></ion-app> 下面的代码接近底部: <script src="cordova.js"></script> <script src="build/main.js
孙亖
2018/06/06
2.9K0
xwiki介绍-所有项目
xwiki有以下类型项目: Top Level Projects: 这些活跃的项目由xwiki开发团队积极的开发中 Contrib Projects: 这些项目不是由xwiki开发团队开发,是一些基于xwiki底层开发的贡献项目 Retired Projects: 这些都是那些曾经被XWiki开发团队开发的活动项目,现在已经作为退休项目被移到在contrib里面,通常是因为有更好的替代品。他们曾经为我们提供了很好的服务,现在等着一些人接管他们,给他们注入新的活力 Top Level Projects 项目名
lovelife110
2021/01/14
9180
xwiki介绍-所有项目
LabVIEW设置应用程序显示标签透明
在美化应用程序时,有时候需要将某些标签设置为透明状态,之前在LabVIEW设计自定义滚动条博文中制作的滚动条是一种方式,但是这种方式明显过于复杂。
不脱发的程序猿
2022/04/13
9930
LabVIEW设置应用程序显示标签透明
使用Ionic2开发Todo应用0 开始之前1 创建新的Ionic 2工程2. 设置主页(Home page)3 持久化数据保存4 总结
本文使用Ionic2从头建立一个简单的Todo应用,让用户可以做以下事情: 查看todo列表 添加新的todo项 查看todo详情 保存 todo到持久化存储 0 开始之前 本教程需要你了解基本的Ionic 2概念。已经在电脑上安装了Ionic 2。如果没有,先去安装和学习吧。 1 创建新的Ionic 2工程 我们将通过生成一个基于“空白”模板的新项目开始。这是一个空的项目框架,但有一些示例代码供我们使用。 运行以下命令创建新项目 ionic start ionic-todo blank --v2 一
孙亖
2018/06/06
6.2K0
【组件篇】ionic3均分列等宽高图像显示(上)
我在《ionic3开源组件》提到了图片选择组件,但是后来发现其实现功能很简单,而且我不喜欢它写死了宽高大小,这对于不同分别率不太友好。于是尝试实现了一下,先上效果图:
IT晴天
2018/08/20
8010
构建具有用户身份认证的 Ionic 应用
使用 Okta 和 OpenID Connect (OIDC),可以很轻松的在 Ionic 应用中添加身份认证,完全不需要自己实现。 OIDC 允许你直接使用 Okta Platform API 进行认证,本文的目的就是告诉你如何在一个 Ionic 应用中使用这些 API。我将演示如何使用 OIDC 重定向、Okta 的 Auth SDK 以及基于 Cordova 内嵌浏览器的 OAuth 进行登录; 由于功能还在开发中,所以省略了用户注册。
叙帝利
2018/07/31
24K0
构建具有用户身份认证的 Ionic 应用
构建具有用户身份认证的 Ionic 应用
序言:本文主要介绍了使用 Ionic 和 Cordova 开发混合应用时如何添加用户身份认证。教程简易,对于 Ionic 入门学习有一定帮助。因为文章是去年发表,所以教程内关于 Okta 的一些使用步骤不太准确,但是通过 Okta 的官网也可以找到对应的内容。另外,使用 npm 安装 Ionic starter 模板可能会有安装失败的情况,建议不要在这方面浪费太多时间,可以直接在 Ionic 的 GitHub 仓库 中下载 starter 模板。 原文:How to Sprinkle ReactJS i
叙帝利
2018/05/28
23.4K0
Ionic 2 应用剖析0 开始之前1 创建一个新的Ionic 2 应用2 目录结构3. Class 定义Root Components 模版App Module总结
0 开始之前 通过本教程之前,您应该至少了解一些基本的Ionic 2概念。您还必须已经安装了Ionic 2 在您的机器上。 1 创建一个新的Ionic 2 应用 我们将使用有Ionic团队创建的tutorial模板,可见于官方教程,来创建我们的应用程序。要做到这一点,您需要运行以下命令: ionic start ionic2-tutorial tutorial --v2 现在您的应用程序将自己开始建立。为运行后续的命令,你应当将项目目录作为当前工作目录: cd ionic2-tutorial 简单瞟一眼应用
孙亖
2018/06/06
4.5K0
OpenStack显示项目列表
[root@controller ~]# openstack project list ID Name ad8d7966165b4619aab21300e50f7020 service b03aac1f6ae94f7bada2afa8f2064312 admin bdc7f07c4d2c42439d3f4ecb4a3d7b59 myproject
院长技术
2020/06/13
1.2K0
IntelliJ IDEA - open 项目后只显示项目中的文件,不显示项目结构
导入之后如下,如果没有显示项目,加入点击 Add Content Root 加入项目路径
小菠萝测试笔记
2021/06/29
2.5K0

相似问题

如何在Ionic2应用程序中设置Backand?

16

如何用Backand和Ionic存储图像?

20

ExpanderView不会显示所有项目

25

Backand:无法通过Backand登录应用程序

11

ionic2向Backand发送对象数据

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文