Указатели на методы-члены работают не так, как вы пытаетесь. Не только синтаксическая ошибка, но и ошибка logi c, поскольку foo1
будет go вне области видимости и будет уничтожен при выходе bar()
, в результате чего updatebarr
останется для вызова printFunc()
на недопустимом объекте foo
.
Для того, что вы пытаетесь сделать, вам понадобится что-то вроде этого:
foo.h
class foo {
public :
int data;
void printFunc(){
cout << "data is " << data;
}
};
bar.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;
}
Live Demo
В качестве альтернативы вы можете сделать updatebarr()
std::function
, который вызывает printFunc()
через лямбда, например:
foo.h
class foo {
public :
int data;
void printFunc(){
cout << "data is " << data;
}
};
bar.h
#include <functional>
#include "foo.h"
class bar {
private:
foo foo1;
public:
bar();
std::function<void()> updatebarr;
};
bar. cpp
#include "bar.h"
bar::bar()
{
foo1.data = 1;
updatebarr = [&](){ foo1.printFunc(); };
}
main. cpp
#include "bar.h"
int main()
{
bar b;
b.updatebarr();
return 0;
}
Live Demo
В этом случае вместо этого вы можете получить лямбда-захват копию объекта foo
, что даст вам результат, очень близкий к вашей исходной попытке, например:
foo.h
class foo {
public :
int data;
void printFunc() const {
cout << "data is " << data;
}
};
бар.ч
#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;
}
Live Демо