Не включайте header.h
в ver1.h
или ver2.h
, но в соответствующие файлы .cpp: FuncPoint
является указателем, поэтому вы можете использовать предварительные объявления. Поскольку оба ver1.h
и ver2.h
будут включены, вам нужно будет переименовать его, однако, там, где оно открыто (в файлах .cpp вы также сможете использовать оригинал FuncPoint
, поскольку вы включите там только одно его определение) :
//ver1.h
#include "ver.h"
struct struct_type_a;
typedef void (*FuncPoint_a)(struct_type_a);
class ver1 : public ver
{
public:
FuncPoint_a f;
static ver1 *create();
};
Кроме того, создание полиморфных объектов должно требоваться к методам, реализованным в файлах .cpp, в статическом методе create()
.
Следуя вашему коду, он станет:
//something.cpp
#include "ver.h"
#include "ver1.h"
#include "ver2.h"
ver* somefunc()
{
if (some_condition)
return ver1::create();
else
return ver2::create();
}
Таким образом, два коллидирующих заголовка никогда не будут включены в один и тот же файл.
Я добавил включение ver.h
в ver1.h
(и ver2.h
), потому что это источник, использующий его. Включение этого в something.cpp
только не правильно (ver1 и ver2 нуждаются в этом) - но не связано с текущей проблемой.