我正在尝试创建一个笔记本程序
.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
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 表达式 才能做到这一点。
人们可能没有注意到那里发生了隐式捕获,但是语言中发生了许多(很多!!!)微妙的小事情;).....