Wt :: Dbo中的循环依赖性

问题描述 投票:4回答:2

Wt建议使用前向声明以避免循环依赖。

// Settings.h
#include <Wt/Dbo/Dbo.h>
#include <string>

class User; // Forward declaration of User Wt::Dbo object

class Settings 
{
public:
  Wt::Dbo::ptr<User> user;

  template<class Action>
  void persist(Action& a)
  {
    Wt::Dbo::belongsTo(a, user);
  }
};

// User.h
#include <Wt/Dbo/Dbo.h>
#include <string>

#include "Settings.h"

class User
{
public:
  Wt::Dbo::weak_ptr<Settings> settings;

  template<class Action>
  void persist(Action& a)
  {
    Wt::Dbo::hasOne(a, settings);
  }
};

但是,当我在另一个cpp文件中使用此Settings类时,该程序无法编译:

// test.cpp
#include "Settings.h"

错误:C2079:“虚拟”使用未定义的类“用户”

可能的解决方案(我不喜欢)

  1. 一个解决方案应在每个包含User.h的cpp文件的Settings.h中包含,即:

    // test.cpp
    #include "User.h"
    #include "Settings.h"
    

    我不喜欢这种解决方案,因为每次我添加User.h时都要记住要包含Settings.h

  2. 另一种解决方法是使用非推荐的DBO_EXTERN_TEMPLATES宏,即

    // Settings.h
    ...
    class Settings
    {
    public:
       ....
    };
    
    DBO_EXTERN_TEMPLATES(Settings)
    

    我不喜欢此解决方案,因为不建议也未记录此宏。 DBO_EXTERN_TEMPLATES不适用于所有编译器。

问题

a。克服Wt::Dbo对象之间的循环依赖关系以避免上述undefined class错误的最佳/首选方法是什么?

b。 为什么解决方案1.起作用?

我创建了一个新的(一般的-不是Wt::Dbo特定问题)(使用MCVE),以阐明具体情况:When are member functions of a templated class instantiated?

参考

c++ wt wt-dbo
2个回答
3
投票

我不熟悉Wt::Dbo,但我不认为这个问题是特定的。这是一个更常见的C ++类设计问题,您需要解决/解决;实际上,这在C ++项目中相当普遍。


0
投票

基于ChrisMM的答案,另一种解决方案是在其头文件的顶部转发声明您的类:

© www.soinside.com 2019 - 2024. All rights reserved.