如何将对象方法的指针发送到函数中?

问题描述 投票:0回答:1

我正在尝试创建一个笔记本程序

.cpp 文件:

#include <string>
#include "Menu.h"

class Notebook
{
    std::vector<std::string> m_notes;
public:
    void addNote()
    {
        std::string text;
        std::getline(std::cin, text);
        m_notes.push_back(text);
    }
    void printNotes()
    {
        int cnt = 0;
        while (true)
        {
            system("cls");
            std::cout << "Press RETURN to quit\n\n";
            std::cout << m_notes[cnt];
            char butt;
            butt = _getch();
            switch (butt)
            {
            case 72:
                if(cnt > 0){ cnt--; }
                break;
            case 80:
                if (cnt < m_notes.size() - 1) { cnt++; }
                break;
            case 13:
                return;
            default:
                break;
            }
        }
    }
};

int main()
{
    Notebook note;
    Menu menu;
    menu.addPar( {"Add note", note.addNote });
}

菜单.h:

#include <iostream> 
#include <vector>
#include <Windows.h>
#include <conio.h>

#ifndef MENU_H
#define MENU_H

void gotoxy(short x, short y)
{
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), COORD{ x,y });
}

struct par
{
    std::string name;
    void (*action)();
    int order = 0;
};

class Menu
{
    std::vector <par> pars;
    int order = 0;

public:
    Menu()
    {

    }

    void addPar(par paragraph)
    {
        pars.push_back(paragraph);
    }

    void callMenu(std::string title)
    {
        int menu = 0;
        char symb = 0;
        while (true)
        {
            std::cout << title << "\n\n";
            for (int i = 0; i < pars.size(); i++)
            {
                std::cout << "  " << pars[i].name << "\n\n";
            }

            switch (symb)
            {
            case 72:
                if (menu > 0)
                {
                    menu--;
                }
                break;

            case 80:
                if (menu < pars.size() - 1)
                {
                    menu++;
                }
                break;
            case 13:
                for (int i = 0; i < pars.size(); i++)
                {
                    if (i == pars[i].order)
                    {
                        system("cls");
                        pars[menu].action();
                        return;
                    }
                }
            }
            gotoxy(1, menu * 2 + 2);
            std::cout << ">";
            symb = _getch();
            system("cls");
        }
    }
};
#endif

我尝试了上面的代码并收到错误:

错误 C3867 'Notebook::addNote':非标准语法;使用 '&' 创建指向 Notebook 成员的指针

我不明白为什么指向 note.addNote 的指针会给我 C3867 :(

P.S Stack Overflow 不喜欢那么多代码,所以我要写一堆废话 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

c++11 pointer-to-member
1个回答
0
投票

使用标准C++库提供的

std::function
来存储和使用函数。

所以在 Menu.h 中你应该写

#include <functional>
// ... CODE

struct par
{
    std::string name;
    // void (*action)();
    std::function<void()> action;
    int order = 0;
};

// ... MORE CODE

现在在主函数中

// ... blah blah main code

int main()
{
    Notebook note;
    Menu menu;
    menu.addPar( {"Add note", [&]{ note.addNote(); } });
}

您使用

note.addNote
,这需要将
note
变量捕获为
this
方法的
Notebook::addNote
指针。因此,您必须显式编写一个 lambda 表达式 才能做到这一点。

人们可能没有注意到那里发生了隐式捕获,但是语言中发生了许多(很多!!!)微妙的小事情;).....

© www.soinside.com 2019 - 2024. All rights reserved.