Na laboratoriach jesteśmy uniezależnieni od środowiska wdrożeniowego - używamy standardowych narzędzi edycyjnych oraz standardowego kompilatora (GNU gcc dla linuksa, MinGW dla windows), dzięki czemu otrzymujemy przenośną aplikację. Jeśli zamierzamy tworzyć nieco bardziej zaawansowane i przenośne aplikacje w C++, oferujące na przykład interfejs graficzny i obsługę zdarzeń, warto rozważyć wdrażanie aplikacji w środowisku Qt.
Aplikacje należy rozwijać metodą ciągłej integracji tzn.:
while (aplikacja nie jest ukończona)
{
dopisz niewielką porcję kodu;
skompiluj;
przetestuj;
}
Alternatywna metoda wielkiego wybuchu (napisz cały kod, skompiluj, wpatruj się w długą listę komunikatów o błędach, wydając nieartykułowane jęki...) prowadzi najczęściej do wielkich kłopotów.
W praktyce (szczególnie przy dużych projektach realizowanych w wieloosobowych zespołach) korzysta się z profesjonalnych środowisk do ciągłej integracji, które wspomagają proces dodawania kodu do repozytorium, budowania, testowania i raportowania.
Rozdzielamy definicję i implementacje klas oraz procedur opakowujących, odpowiednio stosując pliki nagłówkowe i pliki źródłowe. Na Listingach 1-3 przedstawiono sposób podziału kodu źródłowego na moduły oraz sposób kompilacji tak przygotowanego kodu (Listing 4).
Listing 1 Definicja klasy książka (plik ksiazka.h)
#ifndef BOOK_H
#define BOOK_H
class book
{
public:
book();
book(char *,char *);
~book();
private:
char *author;
char *title;
};
#endif // BOOK_H
Listing 2 Implementacja klasy ksiazka (plik ksiazka.cpp)
#include <iostream>
#include <cstring>
#include <cstdio>
#include "ksiazka.h"
using namespace std;
book::book()
{
cout << "constructor1" << endl;
author=new char[1];
title=new char[1];
}
book::book(char *Author,char *Title)
{
cout << "constructor2" << endl;
author=new char[strlen(Author)];
title=new char[strlen(Title)];
sprintf(author,"%s",Author);
sprintf(title,"%s",Title);
}
book::~book()
{
cout << "destructor" << endl;
delete author;
delete title;
}
Listing 3 Procedura opakowująca (plik main.cpp)
#include <iostream>
#include "ksiazka.h"
using namespace std;
int main(void)
{
char *author="Swiatowid Postronny";
char *title="Moje przygody";
book book1;
book book2(author,title);
book *book3=new book(book2);
delete book3;
}
Listing 4 Kompilacja
g++ -c -o main.o main.cpp
g++ -c -o ksiazka.o ksiazka.cpp
g++ -o main.exe ksiazka.o main.o
W praktyce do budowania aplikacji bedziemy wykorzystywać dedykowane narzędzia (przede wszystkim make i nakładki na make jak Cmake lub qmake) i nie będziemy korzystać z plików wsadowych zawierających polecenia budowania, przedstawione na Listingu 4. Jest to jednak już zupełnie inna historia...