【发布时间】:2019-08-04 02:42:07
【问题描述】:
我见过类似的问题,但与我发现自己所处的困境不太一样。我正在使用别人的代码,它们的结构是这样的。
//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 中,因为我必须将其添加到 db_managers cmake 依赖,这意味着我必须在 package.xml 中列出它,然后它会因循环依赖而变得不安。我怎样才能解决这个问题?如果我可以在 db_manager 中使用错误的成员而不使错误成为依赖项,我想我会很好,但我就是不知道该怎么做。我在这里看到了许多其他的前向声明问题,但对于所有这些问题,声明的类的使用都不是很深。这里我使用的是类成员,而不仅仅是像其他问题一样声明类指针。
我绝对可以使用帮助,我只是看不出有任何合乎逻辑的方法可以在不完全废弃错误包并编写新包的情况下执行此操作。
编辑:另外,我简化了这一点,但也许我不应该这样做。 error 和 db_manager 在两个单独的包中。
【问题讨论】:
-
您对 CMake 和循环依赖的说法毫无意义。显然,您不能在 db_manager 标头中包含错误标头,但包含它
db_manager.cpp应该非常好。 -
循环头依赖只是头的问题。由于源文件通常不应该包含在内,它们不能成为循环依赖问题的一部分。尽管作为参考,here 是关于解决它们的问题。
-
db_manager 和错误在 2 个不同的包中。如果我尝试在 db_manager.cpp 中包含错误标头,编译器会说找不到它,这通常是因为 cmakelist 和/或 package.xml 没有包含错误作为依赖项的包.当然,如果我添加它,那么我们就有了循环依赖。
标签: c++ dependencies forward-declaration