C ++使用具有前向声明的成员函数

问题描述 投票:-1回答:1

我见过类似的问题,但不太像我发现自己陷入困境。我正在使用其他人的代码,他们的结构是这样的。

//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在两个单独的包中。

c++ dependencies forward-declaration
1个回答
1
投票

第一:你的榜样非常糟糕。请提供最低限度的工作示例。我理解你的问题是什么(循环依赖),但你的例子没有显示这个问题。这是您必须在架构级别上解决的问题。你无法在CMake中解决这个问题。

根据您显示的代码,您不需要在error.h中包含db_manager.h,因为在类Error的声明期间您没有使用db_manager中的任何内容。您只需要将它包含在error.cpp中,因为您正在使用db_manager中的一个静态方法。这样你就没有任何循环依赖。

我在下面添加了一个最小的工作示例,编译没有任何错误。

error.h

#ifndef _ERROR_H_
#define _ERROR_H_

#include <string>

class Error
{
public:
  enum def_enum{ Val1, Val2};

  bool read(int id);
  static bool logError(def_enum v, std::string msg);
};

#endif /* _ERROR_H_ */

error.cpp

#include "error.h"
#include "db_manager.h"

bool Error::read(int id)
{
    return db_manager::read(id);
}

bool Error::logError(Error::def_enum v, std::string msg)
{
    //do error service stuff
    return true;
}

db_manager.h

#ifndef _DB_MANAGER_H_
#define _DB_MANAGER_H_

#include <string>
#include "error.h"

class db_manager
{
public:
  static bool logError(Error::def_enum v, std::string msg);
  static bool read(int id);
};

#endif /* _DB_MANAGER_H_ */

db_manager.cpp

#include "db_manager.h"

bool db_manager::logError(Error::def_enum v, std::string msg)
{
    return Error::logError(v, msg);
}

bool db_manager::read(int id)
{
    //do db access stuff
    return true;
}

main.cpp中

#include "db_manager.h"
#include "error.h"

int main(){


  db_manager::read(1);
  db_manager::logError(Error::Val1, "Test");

  Error e;
  e.read(2);

  return 0;
}

的CMakeLists.txt

project(db_manager)

add_executable(executable main.cpp db_manager.cpp error.cpp)
© www.soinside.com 2019 - 2024. All rights reserved.