C ++中的委托

时间:2017-12-18 13:09:22

标签: c++ delegation

我试图理解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;
}

基于此source我试过了:

Olaf = &addNumber::changeAge(10);

addNumber test;

Olaf = &addNumber::changeAge(10);

两者都不起作用。这意味着程序没有编译。 我想让person对象使用changeNameaddNumber方法来改变实例人类的年龄。

2 个答案:

答案 0 :(得分:2)

C++11以及稍后您有closures(例如通过std::function等...)和lambda expressions(即anonymous functions

但是你在C ++中并没有delegation,即使你还有pointers函数和指向成员函数的指针。但是,闭包和lambda表达式在表达能力方面几乎等同于委托。

您应该阅读SICP然后阅读一些好的C++ programming书来理解这些概念。

答案 1 :(得分:1)

首先,让我们为函数使用typedef:

typedef int agechanger(int);

这会生成一个新类型agechanger,它将在代码中用于传递函数实例。

现在,您应该为person类提供正确的构造函数,并正确填充提供公共getter的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加1。

让我们测试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 ++的基本主题,例如functionsclasses