EDIT: He leído mal su pregunta :(esto sería una respuesta a la cuestión de si se puede dividir de encabezado y archivos siento
La respuesta simple: Se puede dividir C++ - archivo, pero no se puede dividir hasta encabezados-archivos.
La razón es bastante simple. Cada vez que su compilador necesita compilar un constructor, necesita saber exactamente cuánta memoria necesita asignar para dicho objeto.
por ejemplo:
class Foo {
double bar; //8 bytes
int goo; //4 bytes
}
'new Foo()' requeriría la asignación de memoria de 12 bytes. Pero si se le permitiera ampliar las definiciones de clase en varios archivos (es decir, dividir los archivos de encabezado), fácilmente haría un lío de esto. Su compilador nunca sabría si ya le contó todo sobre la clase, o si no lo hizo. Diferentes lugares en su código podrían tener diferentes definiciones de su clase, lo que llevaría a fallas de segmentación o errores extremadamente crípticos del compilador.
Por ejemplo:
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);
}
Ahora compruebe con mucho cuidado lo que sucede si primero se compila main.cpp a main.o, luego foo1.cpp a foo1.o y foo2.cpp a foo2.o, y fi finalmente, únelos a todos juntos. Esto debería compilarse, pero el makeFoo() asigna algo más que el cleanupFoo() desasignado.
Así que ahí lo tiene, puede dividir archivos .cpp, pero no divida clases sobre archivos de encabezado.
Esto se ve bien, suponiendo que no se olvide de '# include' el encabezado en la implementación. – dasblinkenlight
¿Estás preguntando si puedes evitar escribir 'Graph ::' en la implementación? – GManNickG
Sé que es correcto, pero estoy preguntando si hay otra manera sin tener que repetir Graph :: .. –