проблема с typedef struct - PullRequest
       5

проблема с typedef struct

2 голосов
/ 01 марта 2010

Я новичок в c ++, как сделать так, чтобы код ниже работал (компилируется без синтаксической ошибки)?

typedef struct _PersonA{
    char name[128];
    LPPersonB rel;
}PersonA, *LPPersonA;

typedef struct _PersonB{
    char name[128];
    LPPersonA rel;
}PersonB, *LPPersonB;

Пожалуйста, не спрашивайте меня, почему я должен делать это так, потому что это просто пример, чтобы объяснить мой вопрос.

Ответы [ 3 ]

5 голосов
/ 01 марта 2010

Вы должны форвард объявить:

struct _PersonB;

typedef struct _PersonA{
char name[128];
_PersonB* rel; // no typedef
}PersonA, *LPPersonA;

typedef struct _PersonB{
char name[128];
LPPersonA rel;
}PersonB, *LPPersonB;

Тем не менее, это очень ... безобразно. Во-первых, нет необходимости в typedef в C ++:

struct PersonB;

struct PersonA
{
    char name[128];
    PersonB* rel;
};

struct PersonB
{
    char name[128];
    PersonA* rel;
};

У которого также есть побочный эффект избавления от вашего дурного имени: _PersonA. Это имя зарезервировано для компилятора, поскольку оно начинается с подчеркивания, за которым следует заглавная буква.

И это все. Между прочим, прятать указатели за typedef обычно считается плохим.

3 голосов
/ 01 марта 2010

LPPersonB не определяется, когда вы объявляете thestruct PersonA. Вы должны работать с указателем для этого:

// 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;
};
1 голос
/ 01 марта 2010

Есть несколько способов. Один из них:

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;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...