Я видел подобные вопросы, но не совсем как затруднительное положение, в котором я нахожусь. Я работаю с чужим кодом, и их структура такая:
//db_manager.h
class db_manager
{
class error;
bool logError(error::def_enum::Value v, string msg);
bool read(int id);
}
//db_manager.cpp
#include db_manager.h
bool logError(error::def_enum::Value v, string msg)
{
return error::logError(v, msg);
}
bool read(int id)
{
//do db access stuff
return true;
}
//error.h
#include db_manager
class error
{
bool read(int id);
}
//error.cpp
#include error.h
bool read(int id)
{
return db_manager::read(id);
}
bool logError(error::def_enum::Value v, string msg)
{
//do error service stuff
}
Это довольноочевидное упрощение, но, надеюсь, это демонстрирует проблему.
Когда я компилирую, я получаю много неполных ошибок типа, когда ошибка используется в db_manager.cpp, и я не могу включить соответствующие заголовочные файлы из ошибки вdb_manager.cpp, потому что затем я должен добавить его в зависимости dma_manager cmake, что означает, что я должен перечислить его в package.xml, и тогда он расстроится из-за циклической зависимости.Как я могу обойти это?Если бы я мог использовать члены error в db_manager, не делая ошибку зависимостью, я был бы хорош, я думаю, но я просто не могу понять, как это сделать.Я видел много других вопросов о предварительном объявлении, но для всех них заявленное использование классов не очень глубокое.Здесь я использую членов класса, а не просто объявляю указатель класса, как другие вопросы.
Я определенно мог бы использовать справку, я просто не вижу никакого логического способа сделать это без полного удаления пакета ошибок и записиновый.
Редактировать: также, я упростил это, но, возможно, я не должен был.error и db_manager находятся в двух отдельных пакетах.