quarta-feira, agosto 22, 2007

Referência circular e forward declarations no C++

Quando programamos em C++, temos geralmente um arquivo header, que guarda as assinaturas dos métodos, e um arquivo.cxx, que tem as implementações daquilo que foi declarado no arquivo header. Vamos exemplificar o problema da referência circular.

foo.h
#include "bar.h"
class Foo {
public:
Bar* bar;
}


bart.h
#include "foo.h"
class Bar {
public:
Foo* foo;
}
Note que na classe Foo precisamos incluir a classe Bar e vice-e-versa. Porém, se tentarmos compilar esse código, obteremos um erro de compilação.
O C++, porém nos dá uma ferramenta para acabar com esse problema: o uso de forward declarations. Como o próprio nome já diz, a idéia é anteciparmos a declaração de uma classe a ser usada, porém sem incluir o arquivo header propriamente dito. Vejamos:

arquivo1.h:
#include "bar.h"
class Bar; //Forward declaration da classe Bar
class Foo {
public:
Bar* bar;
}

arquivo2.h:
#include "foo.h"
class For; //Forward declaration da classe Foo
class Bar {
public:
Foo* foo;
}

Isso resolve o problema das referências circulares. Agora só é dar o include dos arquivo headers dentro do arquivo .cxx, onde os métodos foram implemetados. Esse é o segredo: include só nos .cxx, dentro do .h usamos forward declaration para a declaração de classes interdependentes.

Por enquanto é só. Até a próxima!

Nenhum comentário: