C++匿名类「建议收藏」

C++匿名类「建议收藏」java匿名类的C++实现

大家好,欢迎来到IT知识分享网。

一、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();
        }
	}
}

IT知识分享网

主函数

IT知识分享网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一样约定一个接口类,然后在用匿名类去实现接口方法,但也通过函数指针的方式,约定了函数名、函数的参数列表以及函数的返回值。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/10920.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信