[C++]sigslot

#include<iostream>
#include<string>
#include"sigslot.h"

using namespace std;
using namespace sigslot;

enum SwitchState{StateOn,StateOff};

class Switch
{
	public:
		signal0<> Clicked;
		signal1<SwitchState> SetState;
};

class Light: public has_slots<>
{
	public:
		Light(string name,SwitchState sta=StateOff);
		void ToggleState();
		void SetState(SwitchState sta);
		void TurnOn();
		void TurnOff();
	private:
		SwitchState m_sta;
		string m_name;
		void DisplayState();
};

Light::Light(string name,SwitchState sta):has_slots<>()
{
	m_name = name;
	m_sta = sta;
}

void Light::ToggleState()
{
	if(m_sta==StateOn) m_sta=StateOff;
	else m_sta=StateOn;
	DisplayState();
}

void Light::SetState(SwitchState sta)
{
	m_sta = sta;
	DisplayState();
}

void Light::TurnOn()
{
	m_sta = StateOn;
	DisplayState();
}

void Light::TurnOff()
{
	m_sta = StateOff;
	DisplayState();
}

void Light::DisplayState()
{
	if(m_sta==StateOn) cout << m_name << " : StateOn" << endl;
	else cout << m_name << " : StateOff" << endl;
}

int main()
{
	Switch s1,s2;
	Light l1("light_1"),l2("light_2");
	Switch all_on,all_off;

	s1.Clicked.connect(&l1,&Light::ToggleState);
	s2.Clicked.connect(&l2,&Light::ToggleState);
	all_on.Clicked.connect(&l1,&Light::TurnOn);
	all_on.Clicked.connect(&l2,&Light::TurnOn);
	all_off.Clicked.connect(&l1,&Light::TurnOff);
	all_off.Clicked.connect(&l2,&Light::TurnOff);
	s1.SetState.connect(&l1,&Light::SetState);
	s2.SetState.connect(&l2,&Light::SetState);
	
	s1.Clicked.emit();
	s2.SetState.emit(StateOn);
	all_off.Clicked.emit();
	all_on.Clicked.emit();
	
	return 0;
}



你可能感兴趣的:([C++]sigslot)