Это называется предварительным объявлением. Он используется, чтобы ваш код знал, что класс foo существует. Это, в свою очередь, может использоваться панелью классов.
Обычно используется для решения проблем с циркуляром. Возьмите это к примеру
//a.h
#include "b.h"
class A
{
void useB(B obj);
}
и
// b.h
#include "a.h"
class B
{
void useA(A obj);
}
Это вызывает проблему кругового включения, потому что a.h включает в себя b.h, который в свою очередь включает в себя a.h до бесконечности. Вы можете решить эту проблему, сделав предварительное объявление каждого класса в каждом заголовке, например:
//a.h
class B;
class A
{
void useB(B obj);
}
// b.h
class A;
class B
{
void useA(A obj);
}
Примечание: Очень часто, когда у вас есть проблема кругового включения, это указывает на проблему концепции / моделирования. Возможно, вам следует спросить себя, хорошо ли определены ваши классы, прежде чем пытаться решить вашу проблему с помощью предварительных объявлений.