Arhn - архитектура программирования

Лучший способ реализовать структурный полиморфизм

Проблема, с которой я сталкиваюсь в C, заключается в том, что я хотел бы иметь ряд структур, в которых есть базовый элемент из другой структуры. например

struct foo {
    int a;
    void (*calculate)(struct foo *);
};
struct bar {
    int a;
    void (*calculate)(struct foo *);
    double b;
};
void do_thing(struct foo *a)
{
    a->calculate(a);
}

Проблема, с которой я столкнулся, заключается в том, что следующее нарушает строгие правила псевдонимов.

void foo_calculate(struct foo *a)
{
    struct bar *b = (struct bar*)a;
}

Единственный способ, который я придумал для этого, — создать объединение внутри struct foo, содержащее все наследуемые от него структуры. Есть ли более простой способ сделать это?


  • Помогает ли вам ранее упомянутая тема? 15.01.2016
  • @KennyMeyer Я понятия не имею, как я раньше не видел этот вопрос. Это была почти точная фраза, которую я гуглил. Однако, похоже, это не учитывает строгие правила псевдонимов. 15.01.2016
  • как насчет этого: stackoverflow.com/questions/27980925/ 15.01.2016
  • также это: stackoverflow.com/questions/31477307 / 15.01.2016
  • Вчера я ответил на аналогичный вопрос: stackoverflow.com/questions/34777451/ 15.01.2016
  • @CraigEstey, можете ли вы пометить этот вопрос как дубликат этой темы? 15.01.2016
  • @CraigEstey, ты понял 15.01.2016
  • @KennyMeyer сделал ... 15.01.2016
  • Я не понимаю, как я должен иметь доступ к членам производного класса из виртуальной функции в решениях, подобных этому. stackoverflow.com/questions/34777451/ 15.01.2016
  • В дополнение к вопросу SO, который вы ищете, для получения отличной статьи/учебника по неполным типам данных, инкапсуляции, сокрытию данных, динамической компоновке/поздней привязке и объектно-ориентированным подходам к динамическим структурам данных см. Объектно-ориентированное программирование в ANSI-C. Несмотря на то, что он написан на языке C и требует довольно глубоких знаний, он стоит усилий, необходимых для усвоения материала. Он охватывает ряд тем, не включенных в большинство книг или руководств по C. 15.01.2016
  • Это может нарушать или не нарушать строгие правила псевдонимов, но ваш подход похож на мой [в ссылке]. Если компилятор жалуется, попробуйте выполнить приведение к void * с правой стороны. Есть и другие ответы, но мой — это то, что я использовал [с успехом] в течение многих лет. 15.01.2016
  • Не используйте компиляторы, которые не гарантируют (и не документируют) хорошее поведение. Причудливые оптимизации, основанные на внимательном чтении стандарта, такие как строгие правила псевдонимов или предположение, что возможное неопределенное поведение никогда не срабатывает, являются плохим поведением. Для, например. GCC, это означает, что вы должны явно отключить довольно много оптимизаций. 16.01.2016

Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..