2016-09-21 3 views
1

У меня есть большое количество отдельных типов данных (то есть: процессы, файлы, потоки, функции и т. Д.), Которые определены короткими, простыми .c/.h файлами. Как только я закончил выполнение отдельных частей и завершил тестирование единицы/кода, я перешел к соединению частей вместе.struct with pointer-to-parent-struct: лучший подход

Текущая реализация использует указатель на struct через родителями и (void *) указатели в коде, то есть:

struct typeB { 
    int B; 
    void *parent; 
}; 

struct typeC { 
    int C; 
    void *parent; 
}; 

struct typeA { 
    int a; 
    struct typeB *pB; 
    struct typeC *pC; 
}; 

Я использовал void * указатели из-за того, как сложны некоторые struct s являются, и они не будут компиляция, если я использую фактические pointer-to-struct-type вместо void *.

Есть несколько функций, где typeB и typeC необходимо говорить друг другу, но они редки. Кроме того, обе эти struct s никогда не должны знать о int a в parent.

я мог удалить parent struct указатели и реорганизовать свои прототипы функций/определения для простой все принимают (struct typeA *) в качестве аргумента, получить доступ к суб-структуры, и т.д., но это кажется излишним, поскольку некоторые функции просто необходимо иметь доступ к typeB/typeC структуры и их элементы.

Существует ли де-факто (негрузово-культовое программирование) для обработки такой организации структур (аналогично правилу «не накладывать malloc()», которое я часто повторяю на этом сайте)?

спасибо.

+1

Передовые декларации. Используй их. –

+0

@ н.м. Справедливо. Кроме того, существуют ли какие-либо существенные проблемы с использованием логики-указателя-родителя-структуры? Спасибо. – DevNull

+0

, если вы пытаетесь реализовать наследование, убедитесь, что выровняете родительский указатель в 0-й части структуры, поэтому смещение будет 0 –

ответ

2

Я недействительные * указатели из-за того, как сложны некоторые структурами являются, и они не компилируются, если я использую фактический указатель на STRUCT типа вместо пустоты *.

И что не так с передовыми объявлениями?

struct typeA; // forward declaration 

struct typeB { 
    int B; 
    struct typeA *parent; 
}; 

struct typeC { 
    int C; 
    struct typeA *parent; 
}; 

struct typeA { 
    int a; 
    struct typeB *pB; 
    struct typeC *pC; 
}; 

На ваш вопрос: Если вы не хотите/нужно хранить скобка, как часть структуры, то вам нужно либо

а) передать родительский адрес в качестве параметра, на самом деле, или

b) определить статическую переменную типа и указать адрес родительской структуры перед вызовом любого метода, работающего с дочерними элементами.

Последнее решение не является потокобезопасным, хотя и подвержено ошибкам.

Смежные вопросы