функция-член, относящаяся к функции-члену объекта - PullRequest
0 голосов
/ 29 мая 2020

Я новичок в C ++, поэтому заранее извиняюсь, если этот вопрос неправильно структурирован.

У меня есть класс, который создает экземпляр объекта другого класса, я бы хотел, чтобы функция-член основной класс (извините за мой наивный язык), в свою очередь, ссылается на функцию-член объекта, созданного в основном классе.

Я прикрепил фрагмент для справки

foo .h

class foo {
public : 

int data;
void printFunc(){
cout<< "data is"<< data;
}

};

bar.h

class bar {

public:
void updatebarr ();
}

bar. 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(); 
}

Я получаю сообщение об ошибке: «Должна быть вызвана ссылка на нестатическую c функцию-член»,

Ответы [ 2 ]

1 голос
/ 29 мая 2020

Подписи могут выглядеть одинаково, но это не бесплатные функции, а функции-члены . Взгляните на этот часто задаваемый вопрос!

Тип первого: void (foo::*)(), а второго - void (bar::*)(). Видите разницу?

Их можно вызывать только для объекта соответствующего типа. Что вы можете сделать, это:

class bar {
  public:
    void updatebarr(foo& f) {
      f.printFunc();
    }
};
0 голосов
/ 29 мая 2020

Указатели на методы-члены работают не так, как вы пытаетесь. Не только синтаксическая ошибка, но и ошибка 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 Демо

...