c++ - Typedef 循环依赖

标签 c++ forward-declaration circular-dependency

如何解决以下循环依赖?

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; 

最佳答案

你不能让类型相互包含彼此。想一想:编译器会进入生成数据的无限循环。

一般有两种模式:第一种是通过数据类型相互指向

struct OddNode; // forward declaration

struct EvenNode 
{
    OddNode* prev;
    OddNode* next;
};

struct OddNode
{
    EvenNode* prev;
    EvenNode* next;
};

如果您不使用指针,并通过值包含来实现偶节点和奇节点,那么编译器将永远无法解析定义。

一般来说:只需画出您希望如何布置数据的图片,其中框代表数据,线条连接各个部分。然后用类替换每个框,用指向相应类的指针替换每一行。如果您在某处有循环依赖,只需在代码顶部转发声明类即可。

第二个循环依赖是通过Curiously Recurring Template Parameter (CRTP)

template<typename T> 
struct Y 
{};

struct X
: 
    public Y<X> 
{};

您的示例将使用带有 Structure 的 CRTP作为Xstd::list< ..., Structure>作为Y<X> .

关于c++ - Typedef 循环依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11884915/

相关文章:

C++ 包含文件混淆

c++ - 循环包含父项、子项和其他项

iphone - 寻找循环引用

objective-c - Objective C 和 Cocoa Touch 中的循环导入问题

C++ - 函数中的局部指针变量有什么类型的存储持续时间,它们存储在哪里?

c++ - 带有类名的可变参数模板

c++ - 需要很多类的前向声明是否表明设计不好

c++ - 未在此范围内声明“收银员”

c++ - 从值填充 QTableWidget

c++ - 这些类型是什么?