如何解决以下循环依赖?
typedef boost::variant<int, bool, double, std::string, Structure> Value;
typedef std::list<std::pair<std::string, ValueContainer>> Structure;
typedef std::vector<Value> ValueContainer;
我正在尝试以更多C ++形式表示来自C api数据库的对象。此数据库允许存储值或值数组,以及具有结构的表示,如下所示:
typedef struct ApiStructureMember
{
char* name;
struct ApiValueContainer value;
struct ApiStructureMember_T* next;
} ApiStructureMember_T;
最后,union用于表示值,如下所示:
typedef struct ApiValue
{
union
{
int i;
const char* s;
...
struct ApiStructureMember_T* firstStructureMember;
} value;
} ApiValue_T;
答案 0 :(得分:5)
您不能将彼此包含类型。想一想:编译器会进入生成数据的无限循环。
有两种常规模式:第一种是通过指向彼此的数据类型
struct OddNode; // forward declaration
struct EvenNode
{
OddNode* prev;
OddNode* next;
};
struct OddNode
{
EvenNode* prev;
EvenNode* next;
};
如果省略指针,并按值包含实现Even和Odd节点,则编译器永远无法解析定义。
一般情况下:只需绘制一张图片,说明您想要如何布局数据,方框表示连接各个部分的数据和线条。然后用一个类替换每个框,每行用指向相应类的指针。如果你在某处有一个循环依赖,只需在你的代码顶部声明类。
第二个循环依赖是通过奇怪的重复模板参数(CRTP)
template<typename T>
struct Y
{};
struct X
:
public Y<X>
{};
您的示例将使用Structure
作为X
和std::list< ..., Structure>
作为Y<X>
的CRTP。
答案 1 :(得分:2)
这不是解决方案吗?
class Structure;
typedef boost::variant<int, bool, double, std::string, Structure> Value;
typedef std::vector<Value> ValueContainer;
class Structure: public std::list<std::pair<std::string, ValueContainer>>
{
};