Mamy klasę w pliku test.cpp:
#ifndef _TEST_H_
#define _TEST_H_
class test
{
private: int t;
public: int value()
{
return t;
}
test(int);
};
#endif
W pliku test.cpp:
#include "test.h"
test::test(int a)
{
t=a;
}
Plik pik.h:
#ifndef _PIK_H_
#define _PIK_H_
int pik();
#endif
pik.cpp:
#include <iostream>
#include <test.h>
using namespace std;
int pik()
{
test t(2);
cout<<"pik: "<<t.value()<<endl;
}
main.cpp:
#include <iostream>
#include "test.h"
#include "pik.h"
int main()
{
test t;
cout<<t.value()<<endl;
pik();
}
oraz plik Makefile:
prog: main.o pik.o test.o
gcc -o $@ $^
main.o: main.cpp
gcc -o $@ -c $<
pik.o: pik.cpp
gcc -o $@ -c $<
test.o: test.cpp
gcc -o $@ -c $<
I teraz wykażę jakim błędem jest definiowanie metod podczas deklaracji w plikach nagłówkowych.
- Metoda value klasy test wystąpi w plikach obiektowych main.o i pik.o oraz test.o. Jedna metoda jest kompilowana 3 razy. Wydłuża to czas kompilacji.
- Plik Makefile jest źle skonstruowany, aby pokazać, że zmiana metody w pliku test.h i ponowna kompilacja prowadzi do błędu. Nie ma zależności do plików nagłówkowych. Nowa metoda będzie tylko w pliku test.o. Linker skorzysta z metody z pliku main.o, dlatego, że jest pierwsza na liście. Będzie to stara metoda.
W wielu projektach widziałem takie krtótkie metody. Teraz pokazałem, że pliki nagłówkowe służą tylko do deklaracji. Definiowanie metod i funkcji w plikach nagłówkowych jest błędem. Zapraszam do polemiki.