【问题标题】:Delegation in C++C++ 中的委托
【发布时间】:2017-12-18 13:09:21
【问题描述】:

我正在尝试理解 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 类方法来更改实例 person 类的年龄。

【问题讨论】:

  • "...我读到“委托是指向函数的指针”..." - 你在哪里读到的?
  • 你的问题是什么?
  • 请定义“两者都不起作用。
  • 完全不清楚Olaf = &amp;addNumber::changeAge(10); 应该做什么。 Olafperson 而 rhs 很可能应该是函数指针(它不是)。该任务应该如何进行?
  • 您正在尝试将函数调用返回的值的地址分配给不相关类型person 的对象。这与指向函数或委托的指针无关。你应该先熟悉C++ syntax

标签: c++ delegation


【解决方案1】:

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

typedef int agechanger(int);

这创建了一个新类型agechanger,它将在代码中用于传递函数实例。

现在,您应该为您的 person 类提供一个适当的构造函数,并适当地封装 age 字段以提供公共 getter。然后添加一个接受函数作为参数的方法,当然是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!
}

我希望拥有有效的代码能够帮助您更好地理解事物。您在这里询问的主题通常被认为是高级主题,而我认为您应该首先回顾一些更基本的 c++ 主题(例如functionsclasses)。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-20
      • 2010-10-08
      • 2010-11-01
      相关资源
      最近更新 更多