我是c ++的新手,如何在下面编写代码(编译没有语法错误)?
typedef struct _PersonA{
char name[128];
LPPersonB rel;
}PersonA, *LPPersonA;
typedef struct _PersonB{
char name[128];
LPPersonA rel;
}PersonB, *LPPersonB;
请不要问我为什么需要这样做,因为这只是解释我问题的一个例子。
答案 0 :(得分:5)
你必须转发声明:
struct _PersonB;
typedef struct _PersonA{
char name[128];
_PersonB* rel; // no typedef
}PersonA, *LPPersonA;
typedef struct _PersonB{
char name[128];
LPPersonA rel;
}PersonB, *LPPersonB;
那就是说,这非常......丑陋。首先,C ++中不需要typedef:
struct PersonB;
struct PersonA
{
char name[128];
PersonB* rel;
};
struct PersonB
{
char name[128];
PersonA* rel;
};
这也有消除你的坏名字的副作用:_PersonA
。此名称是为编译器保留的,因为它以下划线后跟大写字母开头。
就是这样。顺便说一下,隐藏在typedef背后的指针通常被认为是坏的。
答案 1 :(得分:3)
当您声明构造PersonA时,未定义LPPersonB。你必须使用指针:
// declare this so the compiler know that struct _PersonaB exist (even if it does not know its implementation)
typedef struct _PersonaA PersonaA;
typedef struct _PersonaB PersonaB;
// define PersonaA
struct _PersonA{
char name[128];
PersonB *rel; // does not need to know personB implemenation since it is a pointer
} ;
// define PersonA
struct _PersonB{
char name[128];
PersonA *rel;
};
答案 2 :(得分:1)
有几种方法。一个是:
typedef struct _PersonA PersonA, *PtrPersonA;
typedef struct _PersonB PersonB, *PtrPersonB;
struct _PersonA {
char name[128];
PtrPersonB rel;
};
struct _PersonB {
char name[128];
PtrPersonA rel;
};
另一个是:
struct _PersonA {
char name[128];
struct _PersonB *rel;
};
struct _PersonB {
char name[128];
struct _PersonA *rel;
};