Partea a-II-a: Plictisitoarea teorie
Unul din principalele obiective ale tutorialului este accesarea cu usurinta a setarilor
definite de utilizator. In aceasta idee am putea crea o singura clasa si sa-i accesam membrii
din toate widget-utile si obiectele din program. Imaginati-va ca vom crea o astfel de
clasa si o numim Configuration. Ar exista doar un singur obiect de configurare in
program si care ar trebui sa fie disponibil pe intreaga durata a executiei (de la primul obiect
creat pina la ultimul distrus). De ce trebuie creat asa? Cind initializam aplicatia, probabil
multe obiecte depind de setari cind sint create si deci trebuie sa ne asiguram ca este creat
intodeauna si este singura instanta a obiectului de configurare.
Cum putem face asa ceva? Cream o clasa singleton (puteti citi mai multe despre
aceasta tehnica in una din cartile lui Scott Meyers "Effective C++"). Este simplu, nu lasam
utilizatorul sa creeze de mina o instanta a clasei sau sa creeze fii ai clasei! Putem sa facem
acest lucru folosind constructorul implicit ca privat.
Dar, va veti intreba, cum vom crea o instanta a clasei Configuration in cele din urma?
O variabila globala este o alegere proasta deoarece in standardele C++ nu exista o ordine concreta
in initializarea variabilelor globale. Asta inseamna ca s-ar putea sa folositi obiectul
inainte de a fi construit. Standardele C++ spun ca o variabila statica intr-o functie
trebuie creata inainte de primul apel al functiei, asa ca vom crea o functie care va intoarce o
referinta la obiectul declarat static in interiorul funtiei si astfel vom fi siguri ca acel
obiect va exista ori de cite ori il vom accesa.
Toate aceste sint ilustrate de liniile de cod de mai jos:
#ifndef CONFIGURATION_H
#define CONFIGURATION_H
class Configuration {
public:
// aici puteti adauga membrii publici
// pentru setarile utilizatorului
private:
Configuration();
Configuration(const Configuration&);
// permite creare unei singure instante
friend Configuration& Config();
};
// folositi aceasta functie pentru a accesa setarile
Configuration& Config();
#endif // CONFIGURATION_H
configuration.h
#include "configuration.h"
Configuration::Configuration() {
// DE FACUT: Initializarea setarilor utilizatorului
};
Configuration& Config() {
static Configuration conf;
return conf;
};
configuration.cpp
Ori de cite ori functia globala Config() este apelata, aceasta va returna o
referinta la obiectul de configurare deja creat. De acum incolo putem folosi configuratia
setarilor in orice parte a programului, doar incluzind antetul obiectului de configurare si
primind o referinta la acel obiect prin functia Config().
Presupunind ca avem o variabila m_myButtonText in clasa de configurare,
puteti accesa variabila in genul Config().m_myButtonText=....
Inainte de a termina aceasta parte a tutorialului, vreau sa fac o scurta remarca in ceea ce
priveste adaugarea de clase noi in proiectul KDevelop. Exista diferite metode de a adauga o clasa
(inclusiv fisierele de implementare si definitie). Prima metoda, cea mai sigura si rapida, este
sa folosim vrajitorul "New class" (clasa noua).
Celalalta metoda ar fi sa cream ambele fisiere (<newclass>.h and <newclass>.cpp)
si sa folosim "Managerul automake" pentru a adauga fisierele la proiect. Astfel, deschideti
"Managerul automake", selectati proiectul curent (fereastra de jos, "settingstutorial
(program in bin)") si alegeti din meniul contextual "Add existing files".
Fara KDevelop: |
 |
 |
 |
In acest caz va trebui sa creati cele doua fisiere singuri (este destul
de simplu) si mai trebuie sa modificati fisierul Makefile.am din subdirectorul
src. Trebuie doar adaugati fisierul configuration.cpp in linia cu fisiere sursa.
Ar trebui sa arate cam asa:
settingstutorial_SOURCES = main.cpp \
settingstutorial.cpp \
configuration.cpp
|
|
Dupa ce veti adauga clasa de configurare la proiect si il veti compila, veti fi gata pentru
partea a-III-a.
In cazul in care doriti sa va scutiti de munca (totusi, pentru a invata este recomandabil
sa creati proiectul si fisierele singuri) puteti descarca arhiva proiectului de la:
settingstutorial-01.tar.gz
Retineti ca dupa ce deschideti proiectul in KDevelop, trebuie sa executati pentru prima data
meniul "Build -> Run automake & friends", dupa care
"Build -> Run Configure" si apoi puteti sa compilati proiectul.
Fara KDevelop: |
 |
 |
 |
Executati liniile urmatoare:
make -f Makefile.cvs
./configure
make
|
|
|