¿Qué librerias incluir en un codigo separado? (C++)

Buenas, tengo una pequeña duda a la hora de separar el código. Me han dejado claro que cada clase debe llevar un fichero .h y un fichero.cpp, pero mi duda es, que incluye cada cabecera.
Se que cada .cpp incluye su .h y el main incluye los .h, vale. Pero si tengo que usar una clase en otra, tambien tengo que incluir su .h en el otro fichero? Pongo mi ejemplo, tengo el juego de las damas con las siguientes clases:
-Ficha
-Tablero
-Partida

Uso dos listas de fichas en tablero como atributo. ¿Por tanto tengo que incluir "ficha.h" en tablero.h?
Gracias de antemano.

EDITO: que conste que esto es mas bien, una duda sobre la optimización, porqeu antes lo que hacia era incluir todas las librerias en todos los .h y dudo que sea lo correcto
El tema de las cabeceras puede resultar díficil para los nuevos.

Efectivamente tienes que incluir fichas.h en la cabecera de tablero.h. Es la solución muy adecuada (cuidado, si haces eso no puedes incluir tablero.h desde fichas.h o el compilador entrará en bucle [+risas] ). De todas formas esas inclusiones dobles son menos frecuentes de lo que parece (ya que normalmente trabajas modularmente).

Otra opción es, si vas a seguir tu definición al pie de la letra (.h para las clases y cpp para las implementaciones) hacerte un .h general que contengan una definición de todas las clases. Siguiendo tu ejemplo:

Indice.h
#ifndef INDICE_H
#define INDICE_H

class Ficha;
class Tablero;
class Partida;

#endif


La ventaja esque te protege contra las inclusiones dobles.

Esto solo te sirve para los .h, para implementar los cpp no te sirve (te dará error porque no sabe que metodos usar). Por lo que tendrás que incluir ficha.h desde tablero.cpp. Quedaría entonces así:

Tablero.h
#ifndef TABLERO_H
#define TABLERO_H

#include "indice.h"

class Tablero
{
// lo que sea...
};

#endif


Tablero.cpp
#include "tablero.h"
#include "ficha.h"

// blablabla...
Antes de nada, agradecerte tu tiempo, la respuesta me ha ayudado muchisimo, aunque me pasé un tiempo atascado porque me salia:
"El agregado partida A(A es el nombre del objeto) tiene un tipo incompleto y no se puede definir".
Tardé un rato en darme cuenta de que debía introducir partida.h en el main y no solo indice.h

De nuevo, muchísimas gracias tio
En el main no debes incluir el indice.h, de hecho no debes incluirlo en ningun cpp. El indice.h no está preparado para la implementación (el compilador sabe que existe, pero no sabe que métodos, operaciones y variables tiene).

El indice.h es para incluirlo en los .h.
Oh, de nuevo, muchisimas gracias. Fue el unico cpp en el que lo incluí (despiste total [+risas] ) Pero ahora ya lo entiendo todo perfectamente. No te positivo porque no se puede dar, que si no XD
Salu2!
Puedes dar al pulgar en su comentario :)
5 respuestas