Делегирование в переполнении стека

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

#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);

или же

addNumber test;

Olaf = &addNumber::changeAge(10);

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

-7

Решение

Во-первых, давайте используем 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;
}
};

Обратите внимание, что функция помечена как статический и возвращает пройденное 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!
}

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

1

Другие решения

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

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

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

2

По вопросам рекламы [email protected]