EDIT: misread pytanie :(to byłaby odpowiedź na pytanie, czy można podzielić nagłówka plików przykro
Prosta odpowiedź: można podzielić C++ - plik, ale nie można podzielić do plików nagłówkowych.
Powód jest dość prosty. Ilekroć kompilator musi skompilować konstruktor, musi dokładnie wiedzieć, ile pamięci musi przeznaczyć na taki obiekt.
np
class Foo {
double bar; //8 bytes
int goo; //4 bytes
}
'nowe Foo()' wymaga przydział pamięci 12 bajtów. Ale jeśli pozwolono ci rozszerzyć definicje klas na wiele plików (tzn. Podzielić pliki nagłówkowe), łatwo by się z tym bałagan. Twój kompilator nigdy by się nie dowiedział, gdybyś powiedział mu wszystko na temat klasy, czy też tego nie zrobiłeś. Różne miejsca w kodzie mogą mieć różne definicje twojej klasy, co prowadzi do błędów segmentacji lub bardzo tajemniczych błędów kompilatora.
Na przykład:
h1.h:
class Foo {
double bar; //8 bytes
int goo; //4 bytes
}
h2.h: include "h1.h"
class Foo {
double goo; //8 bytes
}// we extend foo with a double.
foo1.cpp:
#include "foo1.h"
Foo *makeFoo() {
return new Foo();
}
foo2.cpp:
#include "foo2.h"
void cleanupFoo(Foo *foo) {
delete foo;
}
foo1.h:
#include "h1.h"
Foo *makeFoo();
foo2.h:
#include "h1.h"
#include "h2.h"
void cleanupFoo(Foo *foo)
main.cpp:
#include foo1.h
#include foo2.h
void main() {
Foo *foo = makeFoo();
cleanupFoo(foo);
}
Teraz bardzo uważnie sprawdzić, co się dzieje, jeśli najpierw skompilować main.cpp do main.o, następnie foo1.cpp do foo1.o i foo2.cpp do foo2.o, i fi połączyć wszystkie razem. To powinno się skompilować, ale makeFoo() przydziela coś innego, niż cleanallFoo() deallocated.
Więc nie ma, podziel się plikami .cpp, ale nie dziel się klasami na pliki nagłówkowe.
To wygląda dobrze, zakładając, że nie zapomnisz "# include" nagłówka w implementacji. – dasblinkenlight
Czy pytasz, czy możesz uniknąć wpisywania 'Graph ::' w implementacji? – GManNickG
Wiem, że to prawda, ale pytam, czy jest inny sposób, bez konieczności powtarzania wykresu: .. –