gpt4 book ai didi

c++ - 为什么我不能将 this 指针显式传递给成员函数?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:27:12 27 4
gpt4 key购买 nike

C++ 标准 (ISO c++11) 在第 9.3.1 节中提到

A non-static member function may be called for an object of its class type, or for an object of a class derived (Clause 10) from its class type, using the class member access syntax (5.2.5, 13.3.1.1).

尝试使用 g++(版本 4.8.2)编译此代码

 class foo{
public:
void bar(){
cout<<"hey there"<<endl;
}
};
int main(){
foo obj;
foo::bar(&obj);
}

给出编译时错误,因为它无法匹配函数的签名。考虑到标准关于调用成员函数的规定,我想这是意料之中的。由于该方法在编译的某个阶段最终会采用类似于 bar(foo*) 的形式,为什么标准要求使用成员访问语法来调用成员函数?

最佳答案

让我们添加一个静态成员到类中:

 class foo{
public:
void bar() { cout<<"hey there"<<endl; }
static void bar(foo*) { cout<<"STATIC MEMBER"<<endl; }
};

现在如果你这样写:

 foo::bar(&obj); //static or non-static?

应该调用哪个函数?在这种情况下,您如何调用它们两者?语法是什么?如果您允许一个函数具有此语法,则必须为其他函数放弃它(即语法)。标准决定为 static 成员函数使用 foo::bar(&obj) 语法,而为 non-static 成员函数放弃它。


无论如何,如果你想将 &obj 作为参数传递给非静态成员函数,那么你可以使用 std::function 促进的类型删除,如下所示:

 void (foo::*pbar)() = &foo::bar; //non-static member function   #1

std::function<void(foo*)> bar(pbar);

bar(&obj); //same as obj.bar();

同样,您可以调用静态成员函数:

 void (*pbar)(foo*) = &foo::bar; //static member function            #2

std::function<void(foo*)> bar(pbar);

bar(&obj); //same as foo::bar(&obj);

请注意,在 #1#2 行,对象 pbar 的类型使编译器选择正确的成员函数 —在第一种情况下,它采用指向 非静态 成员函数的指针,而在后一种情况下,它采用指向 static 成员函数的指针。

希望对您有所帮助。

关于c++ - 为什么我不能将 this 指针显式传递给成员函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26667756/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com