C++ 中的委托
Delegation in C++
我想了解 C++ 中的委托。我读到 "delegation is pointer to function",我看到了几个例子,但不幸的是我无法理解。我已经创建了代码来尝试,因为我认为也许在编程时我会理解它。可惜我没有。
#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 对象使用 addNumber
class 方法的 changeName
来改变实例 person class.
的年龄
在C++11 and later you have closures (e.g. thru std::function
etc...) and lambda expressions (that is, anonymous functions)
但是您并不完全 delegation in C++, even if you also have pointers 函数和成员函数指针。但是闭包和 lambda 表达式在表达能力上几乎等同于委托。
您应该阅读 SICP then some good C++ programming 书来理解这些概念。
首先,让我们为函数使用 typedef:
typedef int agechanger(int);
这创建了一个新类型 agechanger
,它将在代码中用于传递函数实例。
现在,您应该给 person
class 一个适当的构造函数,并适当封装 age
字段以提供 public 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 并且 returns 传递的 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
}
让我们创建并使用一个不同的函数,除了 class,这次:
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++ 主题(例如 functions and classes)。
我想了解 C++ 中的委托。我读到 "delegation is pointer to function",我看到了几个例子,但不幸的是我无法理解。我已经创建了代码来尝试,因为我认为也许在编程时我会理解它。可惜我没有。
#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 对象使用 addNumber
class 方法的 changeName
来改变实例 person class.
在C++11 and later you have closures (e.g. thru std::function
etc...) and lambda expressions (that is, anonymous functions)
但是您并不完全 delegation in C++, even if you also have pointers 函数和成员函数指针。但是闭包和 lambda 表达式在表达能力上几乎等同于委托。
您应该阅读 SICP then some good C++ programming 书来理解这些概念。
首先,让我们为函数使用 typedef:
typedef int agechanger(int);
这创建了一个新类型 agechanger
,它将在代码中用于传递函数实例。
现在,您应该给 person
class 一个适当的构造函数,并适当封装 age
字段以提供 public 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 并且 returns 传递的 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
}
让我们创建并使用一个不同的函数,除了 class,这次:
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++ 主题(例如 functions and classes)。