引用对象成员函数的成员函数
member function referring to an object's member function
我是 c++ 菜鸟,所以如果这个问题结构不正确,请提前道歉。
我有一个实例化不同类对象的类,我希望主类的成员函数(请原谅我的天真语言(依次引用主类中实例化的对象的成员函数。
我附上了一个片段以供参考
福.H
class foo {
public :
int data;
void printFunc(){
cout<< "data is"<< data;
}
};
酒吧.H
class bar {
public:
void updatebarr ();
}
酒吧.cpp
bar::bar()
{
foo foo1;
foo1.data = 1;
// the line below is flagged as syntax error
// I want the object of type bar's updatebarr() function to be essentially be calling
// foo::PrintFunc(). I figured this "should" work as the signatures are identical.
this->updatebarr = &foo1.printFunc();
}
我得到的错误是"必须调用对非静态成员函数的引用",
签名可能看起来相似,但这些不是自由函数,而是成员函数。看看这个常见问题解答!
第一个的类型是:void (foo::*)()
,第二个是void (bar::*)()
。看到区别了吗?
只能在其各自类型的对象上调用它们。你可以做的是:
class bar {
public:
void updatebarr(foo& f) {
f.printFunc();
}
};
指向成员方法的指针无法按照您尝试的方式工作。 您不仅有语法错误,而且还是逻辑错误,因为foo1
将超出范围并在bar()
退出时被销毁,从而留下updatebarr
对无效的foo
对象调用printFunc()
。
对于您正在尝试的内容,您将需要更多类似的东西:
福.H
class foo {
public :
int data;
void printFunc(){
cout << "data is " << data;
}
};
酒吧.H
#include "foo.h"
class bar {
private:
foo foo1;
public:
bar();
void updatebarr();
};
酒吧.cpp
#include "bar.h"
bar::bar()
{
foo1.data = 1;
}
void bar::updatebarr()
{
foo1.printFunc();
}
主.cpp
#include "bar.h"
int main()
{
bar b;
b.updatebarr();
return 0;
}
现场演示
或者,您可以将updatebarr()
设置为通过 lambda 调用printFunc()
的std::function
,例如:
福.H
class foo {
public :
int data;
void printFunc(){
cout << "data is " << data;
}
};
酒吧.H
#include <functional>
#include "foo.h"
class bar {
private:
foo foo1;
public:
bar();
std::function<void()> updatebarr;
};
酒吧.cpp
#include "bar.h"
bar::bar()
{
foo1.data = 1;
updatebarr = [&](){ foo1.printFunc(); };
}
主.cpp
#include "bar.h"
int main()
{
bar b;
b.updatebarr();
return 0;
}
现场演示
在这种情况下,您可以让 lambda 捕获foo
对象的副本,这将为您提供非常接近原始尝试的结果,例如:
福.H
class foo {
public :
int data;
void printFunc() const {
cout << "data is " << data;
}
};
酒吧.H
#include <functional>
class bar {
public:
bar();
std::function<void()> updatebarr;
};
酒吧.cpp
#include "bar.h"
#include "foo.h"
bar::bar()
{
foo foo1;
foo1.data = 1;
updatebarr = [foo1](){ foo1.printFunc(); };
}
主.cpp
#include "bar.h"
int main()
{
bar b;
b.updatebarr();
return 0;
}
现场演示
相关文章:
- 如何使用指针传递给函数的数组中对象的函数成员
- c++构造函数成员初始化:传递参数
- 创建 std::函数,它返回具有函数成员值的变量.分段错误
- 如何在C++通过公共函数访问私有函数成员?
- 解释了构造函数成员初始化列表
- 调用std::函数成员时内存损坏
- 是否可以为模板类的模板函数成员设置别名?
- 捕获 lambda 函数C++成员变量
- 构造函数成员初始值设定项跨成员列出,安全吗?
- 获取与在模板参数中传递的函数成员类型相同的类
- 如何从公共函数成员访问地图私有成员
- C 构造函数成员分配优化
- 使用命名空间进行函数成员定义
- 函数成员作为 CUDA 内核的参数
- 模板基类函数成员的别名
- 函数成员中用于void和继承的enable_if
- 头文件中是否定义了一个很长的Class函数成员
- 类内/构造函数成员初始化
- 使用指向部分专用函数成员的指针自动填充向量
- 指向函数成员的指针