Делегирование в С++

Я пытаюсь понять делегирование в С++. Я читал, что «делегирование — это указатель на функцию», видел несколько примеров, но, к сожалению, не могу понять. Я создал код, чтобы попробовать, потому что думал, что, возможно, во время программирования я его пойму. К сожалению, я этого не сделал.

#include <iostream>
using namespace std;

class person{
    private: 
        int age;
    public:
        person(age){
            this->age = age;
        }

        // virtual void changeAge(int arg) = 0;
};

class addNumber {
    public:
        int changeAge(int arg) {
            arg += arg+1; 
        }
};

int main(){
    person Olaf;
}

Итак, основываясь на этом источнике, я попробовал:

Olaf = &addNumber::changeAge(10);

or

addNumber test;

Olaf = &addNumber::changeAge(10);

Оба не работают. Это означает, что программа не компилируется. Я хочу, чтобы объект person использовал метод класса changeName of addNumber для изменения возраста экземпляра класса person.


person Ubunnn    schedule 18.12.2017    source источник
comment
... Я читал, что делегирование - это указатель на функцию... - Где вы это прочитали?   -  person WhiZTiM    schedule 18.12.2017
comment
Какой у Вас вопрос?   -  person EvilTeach    schedule 18.12.2017
comment
Уточните, пожалуйста, что вы подразумеваете под Оба не работают.   -  person Algirdas Preidžius    schedule 18.12.2017
comment
Ваш метод changeAge должен быть либо статическим, либо вам нужно создать экземпляр addNumber.   -  person Jake Freeman    schedule 18.12.2017
comment
совершенно непонятно, что должна делать строка Olaf = &addNumber::changeAge(10);. Olaf - это person, в то время как rhs, скорее всего, должен быть указателем на функцию (это не так). Как это задание должно работать?   -  person 463035818_is_not_a_number    schedule 18.12.2017
comment
Вы пытаетесь присвоить адрес значения, возвращаемого вызовом функции, объекту несвязанного типа person. Это не имеет ничего общего с указателями на функции или делегаты. Сначала вам следует ознакомиться с синтаксисом C++.   -  person user7860670    schedule 18.12.2017
comment
Я пытаюсь заставить «Олафа» использовать метод changeAge класса addNumber. Я не хочу использовать наследование, потому что хочу научиться делегированию.   -  person Ubunnn    schedule 18.12.2017


Ответы (2)


Во-первых, давайте используем typedef для функции:

typedef int agechanger(int);

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

Теперь вы должны дать вашему классу person правильный конструктор и должным образом инкапсулировать поле age, предоставляющее общедоступный геттер. Затем добавьте метод, который принимает в качестве аргумента функцию, разумеется, функцию типа agechanger.

class person
{
private:
    int age;
public:
    person(int age){
        this->age = age;
    }

    int getAge() const {
        return age;
    }
    void changeAge(agechanger f)
    {
        age = f(age);
    }
};

Затем определите функцию, которая соответствует нашему типу, внутри class:

class addNumber {
public:
    static int changeAge(int arg) {
        return arg + 1;
    }
};

Обратите внимание, что функция помечена как static и возвращает переданное значение int, увеличенное на единицу.

Давайте протестируем все в main:

int main()
{
    person Olaf(100); //instance of person, the old Olaf

    Olaf.changeAge(addNumber::changeAge); //pass the function to the person method

    std::cout << Olaf.getAge() << std::endl; //Olaf should be even older, now
}

На этот раз создадим и воспользуемся другой функцией вне класса:

int younger(int age)
{
    return age -10;
}

int main(){

    person Olaf(100);

    Olaf.changeAge(younger);

    std::cout << Olaf.getAge() << std::endl; // Olaf is much younger now!
}

Я надеюсь, что наличие работающего кода поможет вам лучше понять вещи. Тема, о которой вы здесь спрашиваете, обычно считается продвинутой, хотя я думаю, что вам следует сначала просмотреть некоторые более основные темы С++ (функции и классы, например ).

person p-a-o-l-o    schedule 18.12.2017

В C++11 и более поздних версиях используется замыкания (например, через std::function и т. д.) и лямбда-выражения (то есть анонимные функции)

Но у вас точно нет делегирования в C++, даже если вы также иметь указатели на функции и указатели на функции-члены. Но замыкания и лямбда-выражения по мощности выражения почти эквивалентны делегированию.

Вы должны прочитать SICP, а затем немного полезного программирование на C++, чтобы понять эти понятия.

person Basile Starynkevitch    schedule 18.12.2017