Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将成员函数作为参数传递给构造函数_C++_Function Pointers - Fatal编程技术网

C++ 将成员函数作为参数传递给构造函数

C++ 将成员函数作为参数传递给构造函数,c++,function-pointers,C++,Function Pointers,我有一门纽扣课。我希望button类的构造函数接受按下按钮时它将调用的函数。如果button类只从一个类中获取函数,这将很容易,但是button构造函数获取函数的目的是,无论在哪个类中创建按钮,它都能够在创建它的类中存储指向函数的指针 举例说明: struct Button { Button(void (*functionPtr)()) { // Store the function pointer to be called later } }; struct

我有一门纽扣课。我希望button类的构造函数接受按下按钮时它将调用的函数。如果button类只从一个类中获取函数,这将很容易,但是button构造函数获取函数的目的是,无论在哪个类中创建按钮,它都能够在创建它的类中存储指向函数的指针

举例说明:

struct Button {
    Button(void (*functionPtr)()) {
        // Store the function pointer to be called later
    }
};

struct SomeClass {
    void LoadFile();

    SomeClass() {
        Button* temp1 = new Button(&LoadFile); // ???
    }
};

struct AnotherClass {
    void SaveFile();

    SomeClass() {
        Button* temp2 = new Button(&SaveFile); // ???
    }
};

我怎样才能做到这一点呢?

你不可能真正拥有一个指向成员函数的指针,因为没有调用对象的隐藏的
指针是没有意义的

对于您试图解决的问题,有几种常见的解决方案

C
方式:

除了函数指针之外,还存储一个
void*
。然后将
void*
int传递给回调函数。这不太“安全”,但在C中很常见

OOP方式#1:

子类
按钮
,在基类上有一个虚拟函数,比如说
onPress
,可以在子类中实现

OOP方式#2:

拥有一个独立于自定义类实现的
按钮
的回调接口


编辑:或使用评论中提到的lambdas。我仍然在重新学习C++的现代方式。

< P>函数指针和指向成员函数的指针,尽管看起来非常相似,实际上却是完全不同的兽。< /P>
void(*functionPtr)(
是指向不带参数并返回void的函数的指针
&AnotherClass::SaveFile
是指向
AnotherClass
的成员函数的指针。。。它的类型是
void(另一个类::*)()
。请注意,类名是类型的一部分,因此不能简单地将指向成员函数的指针存储到任意类。此外,要调用指向成员函数的指针,您需要一个实例指针——您必须以某种方式存储该指针,但它们也有不同的类型

在C++11中,您可以改为使用类型擦除:

std::function<void()> callback;
现在
temp1->callback()。这正是你想要的。而且,我们仍然可以使用自由函数:

void whatever();
Button* temp3 = new Button(whatever);

插入关于使用原始指针和
new
以及首选
unique_ptr

的常见注意事项,如何存储
std::function
成员,然后传递lambda来为您捕获类?我希望您意识到您需要一个
this
这样或那样的方法,它可以隐藏在绑定包装器中,也可以随函数指针提供(当前甚至不是成员函数指针)。我首先要解决这个问题。你可能想看看,不过,正如@BaummitAugen所指出的,
std::function
+lambda现在非常适合这个。Baum-mit-Augen我该怎么做?我已经完全忘记了Lambda是什么以及它们是如何工作的。我在其他地方见过类似的东西,但我仍然不明白。callback是button.h中的成员变量。创建temp1时到底发生了什么?@GravenFear是的,
std::function
的文档在我使用bind时没有“&”,它抱怨我传递的函数缺少参数列表,但当我添加“&”时,它在输出窗口中给我一个5行“未解析的外部符号”链接器错误(我正在使用Visual Studio).有什么想法吗?@GravenFear你需要&而且你的函数还没有定义。谢谢你的帮助Barry。我让它工作了!!!链接器错误是由链接器错误引起的,不是因为有一个未定义的函数,而是因为我无意中在.h和.cpp文件中定义了模板。新手错误,傻我。再次感谢,我一直在努力获取这个类It’他工作了很长时间了。
Button* temp1 = new Button(std::bind(&OtherClass::LoadFile, this));
Button* temp2 = new Button(std::bind(&AnotherClass::SaveFile, this));
void whatever();
Button* temp3 = new Button(whatever);