C++匿名类

一、java中的匿名类

java的观察者模式:

//观察者
public interface Observer{	
	public void update();
}

//被观察主体
public class Subject{
	private Array<Observer> observers;
	
	public void attach(Observer observer){
		observers.add(observer);
	}
	
	public void notifyAllObservers(){
		for (Observer observer : observers) {
        	observer.update();
        }
	}
}

主函数

class Main{
	public static void main(String[] args) {
        Subject subject = new Subject();
        subject.attach(new Observer(){
        	private int state = 0;//状态
        	public void update(){
        		state++;
				System.out.println("当前状态为" + Integer.toString(state));
			}
		})
    }
}

二、C++匿名类模仿实现

C++没有直接提供匿名类,但说到底,java匿名类主要解决问题如下:
1、保证依赖于接口提供方法的具体实现,从而保证解耦,使得添加的匿名类对同一接口能够有不同的行为。
2、提高可读性,因为添加的匿名类的方法实现就在附近,可以直接阅读,而无需跳到对应的类文件阅读。
3、保持简洁性,这是匿名性所带来的,因为没有命名一个具体的类占用命名空间,因此不会导致类的数目过多,而导致后期难以维护。

C++虽然没有匿名类,但是有匿名对象和匿名函数,可以实现类似的效果。

#include<vector>
#include<iostream>
#include<memory>
using namespace std;
//观察者
class Observer 
{
public: 
	Observer(void  (*doA)()) :doAction(doA) {}
	void (*doAction)();//函数指针
};

//被观察主体
class Subject 
{
	vector<Observer> observers;
public:
	void attach(Observer observer) 
	{
		observers.push_back(observer);
	}
	void notifyAllObservers() 
	{
		for (auto it = observers.begin(); it != observers.end(); it++)
		{
			it->doAction();
		}
	}
};

int main() 
{
	Subject sj;
	sj.attach(Observer([] {static int state = 0; state++; cout << "匿名类1当前状态为"<<state<<endl; }));//匿名函数
	sj.attach(Observer([] {static int state = 2; state++; cout << "匿名类2当前状态为"<<state<<endl; }));
	sj.notifyAllObservers();
}

这种方式虽然没有像java一样约定一个接口类,然后在用匿名类去实现接口方法,但也通过函数指针的方式,约定了函数名、函数的参数列表以及函数的返回值。

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C++11标准中,引入了Lambda表达式,也就是匿名函数。Lambda表达式是一个可以定义和调用函数的快捷方式,它可以在函数内部定义一个匿名函数,而不需要为这个函数命名。 Lambda表达式的语法形式如下: ``` [capture-list](parameter-list) -> return-type { function-body } ``` 其中,`capture-list`表示捕获列表,用于在Lambda表达式中访问外部变量;`parameter-list`表示参数列表;`return-type`表示返回类型;`function-body`表示函数体。 Lambda表达式可以作为函数对象(Function Object)使用,可以在STL中的算法函数(如`std::sort()`)中使用。 例如,下面的代码演示了如何使用Lambda表达式对一个数组进行排序: ```c++ #include <iostream> #include <algorithm> int main() { int arr[] = { 5, 2, 1, 4, 3 }; // 使用Lambda表达式对数组进行排序 std::sort(arr, arr + 5, [](int a, int b) { return a < b; }); // 输出排序后的数组 for (int i = 0; i < 5; ++i) { std::cout << arr[i] << " "; } std::cout << std::endl; return 0; } ``` 输出结果为: ``` 1 2 3 4 5 ``` 在Lambda表达式中,我们使用`[]`来表示捕获列表。捕获列表包括两种形式: - `[]`:表示不捕获任何外部变量; - `[&]`或`[=]`:表示捕获所有外部变量,其中`&`表示按引用捕获,`=`表示按值捕获。 除此之外,我们还可以使用`[x, &y]`这样的形式来指定捕获哪些外部变量,其中`x`表示按值捕获,`&y`表示按引用捕获。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值