2017-12-18 84 views
-7

我想了解C++中的委托。我读到“代表团是功能指针”,我看到了几个例子,但不幸的是我不能得到它。我已经创建了代码来尝试,因为我认为可能在编程时我会理解它。不幸的是我没有。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); 

两个不起作用。这意味着程序不会编译。 想使人对象使用addNumber类方法的changeName来改变实例人类的年龄。

+1

*“...我读到”代表团是指向函数的指针“...”* - 你在哪里读到的? – WhiZTiM

+1

你的问题是什么? – EvilTeach

+0

请定义你的意思是“_Both不工作。” –

回答

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递增。

让我们来测试一切都在一个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 
} 

让我们和使用不同的功能,ouside一类,这一次:

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)。