C++ 指向另一类中成员函数的指针映射

C++ 指向另一类中成员函数的指针映射,c++,static-members,non-static,C++,Static Members,Non Static,我知道,这里已经提出了这个问题,但我相信我的例子是独一无二的: #include <functional> #include <map> #include <vector> class Bar{ public: static unsigned myFunc(const std::vector<std::string> &input){return 1;}; }; class Foo{ friend cla

我知道,这里已经提出了这个问题,但我相信我的例子是独一无二的:

#include <functional>
#include <map>
#include <vector>

class Bar{
    public:
        static unsigned myFunc(const std::vector<std::string> &input){return 1;};
};

class Foo{
    friend class Bar;
    public:
        using CommandFunction = std::function<unsigned(const std::vector<std::string> &)>;
        std::map<std::string, CommandFunction> Commands;
};

int main(){
    Foo oFoo;
    Bar oBar;
    oFoo.Commands["myFunc"] = oBar.myFunc;
    return 0;
}
#包括
#包括
#包括
分类栏{
公众:
静态无符号myFunc(const std::vector&input){return 1;};
};
福班{
朋友类酒吧;
公众:
使用CommandFunction=std::function;
std::map命令;
};
int main(){
福奥福;
巴奥巴;
oFoo.Commands[“myFunc”]=oBar.myFunc;
返回0;
}

我想使
myFunc
函数成为非静态函数,这样它就能够访问
Bar
类的私有成员。但我不知道如何实现这个想法。简单地删除
static
关键字显然会在编译过程中引发错误(非静态函数的使用无效)。有没有“干净”的方法来解决这个问题?“干净”是指不使用全局变量和对象

更新

我想我需要澄清我上面描述的设计的目的。 我正在使用GNU readline库的包装器。它由
Foo
类表示。基本上,它在
命令
映射中保存一组函数指针,并根据用户输入执行它们


Bar
类是一组共享公共资源的函数(属于
Bar
类的私有成员)。

Lambda可能是您的解决方案:

class Bar{
    public:
        std::function<unsigned(const std::vector<std::string>&)> myFunc{ [](const std::vector<std::string>& x){return 1;}};

};
类栏{
公众:
std::函数myFunc{[](const std::vector&x){return 1;};
};

“我想使
myFunc
函数成为非静态函数,这样它就能够访问
Bar
类的私有成员。”这毫无意义
myFunc
是一个成员函数,因此它已经可以访问它有权访问的所有
Bar
对象的私有成员。@Angew否它不能。静态成员函数只能访问静态类成员和函数。静态函数如何知道要更改变量的对象?另一个注释,关于“但我相信我的特定示例是唯一的。”相信是不够的。您必须通过讨论重复项以及它们不适用的原因来解释案例的不同之处。@Angew“除非在成员函数中显式提供对象实例,否则您无法访问静态方法中的非静态成员。(将对象实例显式作为参数传递,或使用可在函数内部访问的全局实例)“@user3125731您是否阅读了副本上的答案?它解释了如何执行此操作。它会起作用,但会破坏我的设计。
Bar
类表示一组共享公共对象的函数(与MySQL数据库的连接、指向类实例的指针等)。这些对象是
Bar
类的私有成员。
Foo
类表示CLI-用户输入命令并根据
命令
映射执行。我希望您能理解。因此,请编辑您的问题,说明此解决方案不可接受。这样他们就可以重新打开您的问题。@HumamHelfawirong与dupe目标的关系?它显示了所有可以做到这一点的方法。我没有任何问题。但是OP不想要std::function解决方案,所以我只是告诉OP在问题中明确说明,这样可以消除重复,有人会用对OP有帮助的东西回答。已经有一个答案解释了如何做到这一点dupe目标上没有lambda。没有理由重新打开以获得专门针对OP的答案。