Суть:
Пока у вас есть два класса (например, A и Visitor), и для реализации каждого из них требуется объявление другого, вы не можете объединить реализацию и объявление.
В вашем случае:
class Visitor {
public:
// Visitor's implementation needs A's declaration
void visit(A *a){ a->doSomething(); }
};
class A {
public:
// A's implementation needs Visitor's declaration
void accept(Visitor *v) { v->visit(this) };
void doSomething() { ... };
};
Это одна из причин, по которой вы хотите иметь объявление и реализацию в отдельных файлах.
Есть много других причин, включая дифференциальное время компиляции.
Могу ли я спросить, почему вы хотите реализовать их все в одном файле?
Но:
В зависимости от того, чего вы пытаетесь достичь, вы можете захотеть обмануть. Но это будет боль поддерживать. Я никогда этого не сделаю, за исключением очень хорошей и необычной причины .
Например, я предполагаю, что что-то подобное должно работать:
class Doer {
public:
// Doer's implementation don't needs Visitor's declaration
virtual void doSomething()=0;
};
class A;
class Visitor {
public:
// Visitor's implementation needs Doer's declaration
void visit(A *a){ ((Doer*)a)->doSomething(); }
};
class A: public Doer {
public:
// A's implementation needs Visitor's declaration
void accept(Visitor *v) { v->visit(this) };
void doSomething() override { ... };
};
Еще раз, если у вас есть выбор: не делайте этого . Предпочитаю разбивать ваш файл. Этот обходной путь, даже хорошо документированный, будет очень трудно поддерживать.