Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Наследование структур


Автор: iDarkLord 4.4.2014, 14:57
Есть более или менее однотипные данные хранящиеся в буфере, хочется оформить их в виде структуры, но длина этих данных и набор полей отличаются, но у всех у них есть общие черты. Как сделать так, что бы структуры как бы наследовались друг от друга. Все это должно быть на чистом Си. Т.е. если бы это был С++ я бы сделал это через наследуемые классы, а в прототип функции писал бы самый высокий в иерархии класс, но как реализовать подобное в Си ? 
Если структуры для этого не подходят, то что лучше использовать ?

Автор: feodorv 4.4.2014, 15:21
Код
struct base
{
  int type;
  char name[16];
  unsigned int value;
};

struct v1
{
  struct base base;
  char id[8];
  int size;
  unsigned int flags;
};

struct v2
{
  struct base base;
  unsigned char blob[16];
};

Конечно, это не наследование, одна видимость, но работать можно:
Код

struct base *b;
switch( b->type )
{
  case TYPE_V1:
  {
    struct v1 *v1 = (struct v1 *) b;
    ...
    break;
  }
  case TYPE_V2:
  {
    struct v2 *v2 = (struct v2 *) b;
    ...
    break;
  }
  default:
    assert( ... );
}

Автор: Romikgy 4.4.2014, 17:36
use union ...

Автор: iDarkLord 5.4.2014, 16:14
Цитата

Конечно, это не наследование, одна видимость, но работать можно


Если я правильно понял вы предлагаете запихать этот switch в каждую функцию которая примет такие "расширенные" структуры в качестве параметра. Как то это через чур =).
Проще наверное передавать в функцию void * ptr и там преобразовывать в тип той структуры, которой надо, но мне не нравиться этот способ.

Цитата(Romikgy @  4.4.2014,  17:36 Найти цитируемый пост)
use union ... 

Use your brain, luke !

Автор: feodorv 5.4.2014, 18:25
Цитата(iDarkLord @  5.4.2014,  17:14 Найти цитируемый пост)
Если я правильно понял вы предлагаете запихать этот switch в каждую функцию которая примет такие "расширенные" структуры в качестве параметра.

Нет, конечно, только туда, где нужно обращение к дополнительным (расширенным) полям.


Цитата(iDarkLord @  5.4.2014,  17:14 Найти цитируемый пост)
Проще наверное передавать в функцию void * ptr и там преобразовывать в тип той структуры, которой надо, но мне не нравиться этот способ.

Без разницы. Если у Вас есть унифицированные поля и расширенные поля, то по одному только ptr Вы не можете понять, какие расширенные поля присутствуют в ptr, все равно где-то нужно хранить информацию о наличии тех или иных расширенных данных, структура это, или объединение, или их микс, или отдельная память под расширенные данные.

Если задача позволяет обойтись указателями на функции-манипуляторы со структурой, то можно их прописать в структуру и с каждым экземпляром таскать их с собой. Но проще, всё же, иметь тип расширенных данных в структуре, и уже потом согласно ему использовать switch, if или массивы функций-манипуляторов на каждый тип расширенных данных (а ля C++).

Автор: borisbn 7.4.2014, 09:00
Цитата(iDarkLord @  5.4.2014,  16:14 Найти цитируемый пост)
Use your brain, luke 

С чего такая реакция?
Romikgy, совершенно справедливо предложил тебе не самое худшее (если не сказать лучшее) решение. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)