Commit d8694d73 by Szeberényi Imre

Boost változattal

parent 1c36713f
#
# Makefile a nyomogomb demo forditasara
# gnumake valtozat
# Linuxokon es ural2-n is elerheto
#
# A program neve (ezt allitjuk elo)
PROG = gomb_demo
PROG_O = $(PROG).o modell.o # program object fajljai
PROG_H = callback.h felhfelulet.h modell.h # program header fajljai
# Rajzatablas valtozathoz torolje a kommentet a kovetkezo sorbol
PROG_L = # program libjei
#fordítasi opciok
CXXFLAGS = -pedantic -Wall -DMEMTRACE
CXXFLAGS += -g # es legyeb debug info is
LDFLAGS = -g # debug a linkelesnel is kell
# osszes object, osszes header osszes lib egyutt
OBJS = $(PROG_O)
HEADS = $(PROG_H)
LIBS = $(PROG_L)
# Alapertelmezett cel
.PHONY: all
all: $(PROG)
# Eloallitjuk az objektekbol a PROG-ot
$(PROG): $(OBJS)
$(CXX) $(LDFLAGS) $(OBJS) -o $@ $(LIBS)
# Feltetelezzuk, hogy az osszes obj fugg az osszes headertol, ami nem feltetlenul igaz
$(OBJS): $(HEADS)
# Futtatas
.PHONY: run
run: $(PROG)
./$(PROG)
# takaritas igeny szerint
.PHONY: clean
clean:
rm -f $(OBJS) $(PROG)
...@@ -24,5 +24,8 @@ int main() { ...@@ -24,5 +24,8 @@ int main() {
cout << "Ismet megyomjuk a gombot: " << endl; cout << "Ismet megyomjuk a gombot: " << endl;
cin.ignore(100, '\n'); cin.ignore(100, '\n');
g1.nyom(); // újra g1.nyom(); // újra
cout << "Ismet megyomjuk a gombot: " << endl;
cin.ignore(100, '\n');
g1.nyom(); // újra
return 0; return 0;
} }
...@@ -14,13 +14,13 @@ using std::endl; ...@@ -14,13 +14,13 @@ using std::endl;
/// Kikapcsol /// Kikapcsol
void Kapcsolo::ki() { void Kapcsolo::ki() {
bent = false; bent = false;
cout << " Kikapcs" << endl; cout << nev << ": Kikapcs" << endl;
} }
/// Bekapcsol /// Bekapcsol
void Kapcsolo::be() { void Kapcsolo::be() {
bent = true; bent = true;
cout << " Bekapcs" << endl; cout << nev << ": Bekapcs" << endl;
} }
/// GombCallback callBack függvényének megvalósítása /// GombCallback callBack függvényének megvalósítása
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
*/ */
#ifndef MODELL_H #ifndef MODELL_H
#define MODELL_H #define MODELL_H
#include <string>
#include "callback.h" #include "callback.h"
/// Drot /// Drot
...@@ -22,8 +23,9 @@ public: ...@@ -22,8 +23,9 @@ public:
/// A kapcsolót modelljét megvalósító osztály /// A kapcsolót modelljét megvalósító osztály
class Kapcsolo :public Drot, public GombCallback { class Kapcsolo :public Drot, public GombCallback {
bool bent; // állapot bool bent; // állapot
std::string nev; // nyomogomb neve
public: public:
Kapcsolo() :bent(false) {} Kapcsolo(const char* n ="") :bent(false), nev(n) {}
/// Kikapcsol /// Kikapcsol
void ki(); void ki();
......
#
# Makefile a nyomogomb demo forditasara
# gnumake valtozat
# Linuxokon es ural2-n is elerheto
#
# A program neve (ezt allitjuk elo)
PROG = gomb_demo
PROG_O = $(PROG).o modell.o # program object fajljai
PROG_H = felhfelulet.h modell.h # program header fajljai
# Rajzatablas valtozathoz torolje a kommentet a kovetkezo sorbol
PROG_L = # program libjei
#fordítasi opciok
CXXFLAGS = -pedantic -Wall -DMEMTRACE
CXXFLAGS += -g # es legyeb debug info is
LDFLAGS = -g # debug a linkelesnel is kell
# osszes object, osszes header osszes lib egyutt
OBJS = $(PROG_O)
HEADS = $(PROG_H)
LIBS = $(PROG_L)
# Alapertelmezett cel
.PHONY: all
all: $(PROG)
# Eloallitjuk az objektekbol a PROG-ot
$(PROG): $(OBJS)
$(CXX) $(LDFLAGS) $(OBJS) -o $@ $(LIBS)
# Feltetelezzuk, hogy az osszes obj fugg az osszes headertol, ami nem feltetlenul igaz
$(OBJS): $(HEADS)
# Futtatas
.PHONY: run
run: $(PROG)
./$(PROG)
# takaritas igeny szerint
.PHONY: clean
clean:
rm -f $(OBJS) $(PROG)
/**
* \file felhfelulet.h
*
* A felhasználói felületet megvalósító osztályok definiciói
* Nem ismeri a modellt.
*
*/
#ifndef FELULET_H
#define FELULET_H
#include <iostream>
#include <boost/signals2.hpp>
/// Gomb.
/// A gomb "megnyomására" meghívódik a nnyom() tagfüggvény
class Gomb {
boost::signals2::signal<void ()> sig;
public:
template <typename F>
Gomb(F f) {
sig.connect(f);
}
/// A felhasználó felületen megnyomták a gombot
void nyom() { // megnyomták
sig();
}
};
#endif // FELULET_H
/**
* Felhasználói felület és a modell kapcsolata
* Callback fv. demó
*
*/
#include <iostream>
#include "modell.h"
#include "felhfelulet.h"
#include <boost/signals2.hpp>
#include <boost/bind.hpp>
using std::cout;
using std::endl;
using std::cin;
int main() {
Kapcsolo k1("k1");
Gomb g1(boost::bind(&Kapcsolo::callBack, &k1)); // itt kötjük össze a felhasználói felületet és a modellt.
cout << "Megyomjuk a gombot: " << endl;
cin.ignore(100, '\n');
g1.nyom(); // felületen megnyomták
cout << "Megint megyomjuk a gombot: " << endl;
cin.ignore(100, '\n');
g1.nyom(); // újra
cout << "Ismet megyomjuk a gombot: " << endl;
cin.ignore(100, '\n');
g1.nyom(); // újra
cout << "Ismet megyomjuk a gombot: " << endl;
cin.ignore(100, '\n');
g1.nyom(); // újra
/// Eddig nem sokban különbözött, csupán nem kellett e callback osztály.
/// De sokkal rugalmasabb. Csupán egy példa:
std::cout << "\nMindent elpszor be-, majd kikapcsol.\n";
Kapcsolo k2("k2");
boost::signals2::signal<void ()> beki;
beki.connect(0, boost::bind(&Kapcsolo::be, &k1));
beki.connect(1, boost::bind(&Kapcsolo::ki, &k1));
beki.connect(1, boost::bind(&Kapcsolo::ki, &k2));
beki.connect(0, boost::bind(&Kapcsolo::be, &k2));
beki();
return 0;
}
/**
* \file modell.cpp
*
* A modell-t megvalósító osztályok deklarációi
* Nem ismeri a felhasználói felületet.
*
*/
#include <iostream>
#include "modell.h"
using std::cout;
using std::endl;
/// Kikapcsol
void Kapcsolo::ki() {
bent = false;
cout << nev << ": Kikapcs" << endl;
}
/// Bekapcsol
void Kapcsolo::be() {
bent = true;
cout << nev << ": Bekapcs" << endl;
}
/// GombCallback callBack függvényének megvalósítása
/// A felhasználói felület ezt hívja
void Kapcsolo::callBack() {
if (bent)
ki();
else
be();
}
/**
* \file modell.h
*
* A modell-t megvalósító osztályok definíciói
* Nem ismeri a felhasználói felületet.
*
*/
#ifndef MODELL_H
#define MODELL_H
#include <string>
/// Drot
/// A drot modelljét megvalósító osztály
class Drot {
public:
/// Valahogy működik.
/// A példa szempontjából érdektelen
void set() {}
};
/// Kapcsoló
/// A kapcsolót modelljét megvalósító osztály
class Kapcsolo :public Drot {
bool bent; // állapot
std::string nev; // nyomogomb neve
public:
Kapcsolo(const char* n ="") :bent(false), nev(n) {}
/// Kikapcsol
void ki();
/// Bekapcsol
void be();
/// GombCallback callBack függvénye
/// A felhasználói felület ezt hívja
void callBack();
};
#endif // MODELL_H
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment