Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Наследование структур 
:(
    Опции темы
iDarkLord
Дата 4.4.2014, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 4.4.2014

Репутация: нет
Всего: нет



Есть более или менее однотипные данные хранящиеся в буфере, хочется оформить их в виде структуры, но длина этих данных и набор полей отличаются, но у всех у них есть общие черты. Как сделать так, что бы структуры как бы наследовались друг от друга. Все это должно быть на чистом Си. Т.е. если бы это был С++ я бы сделал это через наследуемые классы, а в прототип функции писал бы самый высокий в иерархии класс, но как реализовать подобное в Си ? 
Если структуры для этого не подходят, то что лучше использовать ?
PM MAIL   Вверх
feodorv
Дата 4.4.2014, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Код
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( ... );
}


Это сообщение отредактировал(а) feodorv - 4.4.2014, 15:22


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Romikgy
Дата 4.4.2014, 17:36 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 1
Всего: 146



use union ...


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
iDarkLord
Дата 5.4.2014, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 4.4.2014

Репутация: нет
Всего: нет



Цитата

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


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

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

Use your brain, luke !
PM MAIL   Вверх
feodorv
Дата 5.4.2014, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



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

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


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

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

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


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
borisbn
Дата 7.4.2014, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



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

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


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1129 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.