std :: function и friend function - PullRequest
       23

std :: function и friend function

0 голосов
/ 20 апреля 2019

В этом примере у меня есть указатель на функцию (std :: function) в качестве атрибута моего класса. Таким образом, я могу связать любую функцию вида void myFunction (void) с моим классом.

#include <iostream>
#include <functional>

class Example{
private:
    int variable=4;
public:
    std::function<void(void)> myNonMemberFunction;
    Example(void){
    }
    Example(std::function<void(void)> MyNonMemberFunction){
        myNonMemberFunction=MyNonMemberFunction;
    }
};

void PrintPlop(){
    std::cout<<"plop"<<std::endl;
}

int main() {
    Example example(PrintPlop);
    example.myNonMemberFunction();
}

Теперь я хочу сделать то же самое, но с функцией, которая имеет доступ к атрибуту класса, как функция друга или функция члена класса. Как я могу это сделать?

1 Ответ

0 голосов
/ 20 апреля 2019

То есть вы хотите, чтобы любая функция, которую вы передаете конструктору, стала вашим другом?

В строгом смысле это невозможно, потому что уровень доступа (друг или нет) является проблемой времени компиляции, и какое значение передается конструктору, вообще говоря, определяется только во время выполнения.

Таким образом, вы либо объявляете все соответствующие функции друзьями (почему бы не сделать их методами в этом случае?), Либо передаете им закрытые члены в качестве дополнительных параметров. Как это:

class Example{
private:
    int variable=4;
    std::function<void(int)> myNonMemberFunction;
public:
    Example(void){
    }
    Example(std::function<void(int)> MyNonMemberFunction){
        myNonMemberFunction=MyNonMemberFunction;
    }
    void callMyNonMemberFunction() {
      myNonMemberFunction(variable);
    }
};

void PrintPlop(int v){
    std::cout<<"plop"<< v << std::endl;
}

int main() {
    Example example(PrintPlop);
    example.callMyNonMemberFunction();
}
...