如何解决以下循环依赖?
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作为X
和 std::list< ..., Structure>
作为Y<X>
.
关于c++ - Typedef 循环依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11884915/