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);
}
};
但是,当我Settings
在另一个 cpp 文件中使用此类时,程序无法编译:
// test.cpp
#include "Settings.h"
错误:C2079:“虚拟”使用未定义的类“用户”
可能的解决方案(我不喜欢)
一个解决方案是包含
User.h
在每个包含 的 cpp 文件中Settings.h
,即:// test.cpp #include "User.h" #include "Settings.h"
我不喜欢这种解决方案,因为我必须记住
User.h
每次包含Settings.h
.另一种解决方案是使用不推荐的
DBO_EXTERN_TEMPLATES
宏,即// Settings.h ... class Settings { public: .... }; DBO_EXTERN_TEMPLATES(Settings)
我不喜欢这个解决方案,因为这个宏不推荐,也没有记录。
DBO_EXTERN_TEMPLATES
不适用于所有编译器。
问题
一种。克服Wt::Dbo
对象之间的循环依赖关系避免上述undefined class
错误的最佳/首选方法是什么?
湾。为什么解决方案 1. 有效?
我创建了一个新的(一般 - 非Wt::Dbo
特定)问题(使用 MCVE),以澄清具体情况:模板类的成员函数何时实例化?
参考
- DBO_EXTERN_TEMPLATES:https ://www.mail-archive.com/witty-interest@lists.sourceforge.net/msg06963.html
- Wt::Dbo 和循环依赖:https ://redmine.webtoolkit.eu/boards/2/topics/290?r=292
- 给定的示例基于
Wt::Dbo
教程:https ://www.webtoolkit.eu/wt/doc/tutorial/dbo.html#_em_one_to_one_em_relations ,但我想将不同的类放入不同的头文件中。