Вы можете сделать это (однако вы, вероятно, не хотите, по крайней мере, не для примера, на который вы ссылаетесь - см. Ниже).
Во-первых, вот как вы могли бы сделать то, что вы просили:
// a.hpp
#pragma once // or include guards if you can't use pragma once
class IntStack {
...
void push(int n);
...
// b.hpp
#pragma once // or include guards if you can't use pragma once
#include "a.hpp"
void foo() { IntStack i; i.push(0); }
Однако вы, вероятно, не хотите этого делать. Включение заголовков в другие заголовки может привести к увеличению времени компиляции и, как правило, в этом нет необходимости. Что вы хотите сделать, так это иметь объявления для ваших классов, типов и функций в заголовочных файлах, а затем иметь различные определения в файлах cpp.
Для вашего примера:
// a.hpp
#pragma once // or include guards if you can't use pragma once
class IntStack {
...
void push(int n);
...
// a.cpp
#include "a.hpp"
void IntStack::push(int n) {
IntNode *newNode = new IntNode(n);
newNode->next = top;
top = newNode;
return;
}
// b.hpp
#pragma once // or include guards if you can't use pragma once
void foo();
// b.cpp
void foo() {
IntStack i;
i.push(0);
}