C ++ Структура внутри себя?

Я пытаюсь перенести этот код на python, но в C ++ я кое-что не совсем понимаю (я знаю немного C ++, но это вне меня):

typedef struct huffnode_s { struct huffnode_s *zero; struct huffnode_s *one; unsigned char val; float freq; } huffnode_t; 

То, что я не понимаю, – это то, как huffnode_s может быть внутри себя, я никогда не видел этого раньше и не совсем понимаю его. Что это значит, и если кто-то может, что будет эквивалентом питона?

    8 Solutions collect form web for “C ++ Структура внутри себя?”

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

    Эта.

     class Huffnode(object): def __init__(self, zero, one, val, freq): """zero and one are Huffnode's, val is a 'char' and freq is a float.""" self.zero = zero self.one = one self.val = val self.freq = freq 

    Затем вы можете реорганизовать ваши различные функции C как методы этого класса.

    Или, может быть, это.

     from collections import namedtuple Huffnode = namedtuple( 'Huffnode', [ 'zero', 'one', 'val', 'freq' ] ) 

    Если вы хотите, чтобы ваши функции C оставались функциями.

    Вот и все.

     h0 = Huffnode(None, None, 'x', 0.0) h1 = Huffnode(None, None, 'y', 1.0) h2 = Huffnode(h0, h1, 'z', 2.0) 

    Это все, что требуется.

    он не имеет структуры сам по себе. он имеет указатель на эту структуру.

    в памяти struct huffnode_s будет выглядеть (32-битная машина):


    | —————— huffnode_s * zero – 4 байта ————– |

    | —————— huffnode_s * one – 4 байта —————- |

    | unsigned char val – 1 байт + 3 байта padding ======= | |

    | ——————- float freq – 4 байта ————————- |


    эти размеры будут варьироваться от машины к машине, и как она выглядит в памяти, решается компилятором.

    Чтобы добавить к ответу Карла, то же самое на C ++ также возможно:

     class Foo { public: Foo() {} Foo *anotherFoo; }; 

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

    (struct huffnode_s *) объявляет указатель на другую структуру, которая включает в себя те же переменные, что и структура, в которой она объявлена. См. этот вопрос .

    Это указатель на huffnode внутри huffnode. Это означает, что вы можете сказать:

     huffnode_t *node = ...; huffnode_t *greatgreatgreatgrandchild = node->zero->zero->zero->zero->zero; 

    Это будет скомпилировано, и оно будет работать до тех пор, пока все эти потомки huffnode будут фактически выделены и правильно указаны.

    Указатели очень похожи на ссылки на объекты в JavaScript. На самом деле они не содержат данных, они просто ссылаются на него. Будьте уверены, что вы не смотрите на бесконечный тип.

    Это называется самореференциальной структурой, и это именно то, что это звучит: структура, содержащая ссылку на себя. Общее это происходит в структуре, которая описывает узел для связанного списка. Каждому узлу нужна ссылка на следующий узел в цепочке.

     struct linked_list_node { int data; struct linked_list_node *next; // <- self reference }; 

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

    Указатели внутри структуры позволят объединить экземпляры вместе в виде связанного списка.

     
    Interesting Posts for Van-Lav

    Python Web Scraping – ошибка urlopen Имя или услуга неизвестны

    Максимальное количество подключений на хост с помощью twisted.web.client.Agent

    python-dbg не может найти Py_InitModule4 при отладке

    Как удалить программу, установленную с distutils?

    Parsing IMAP Email BODYSTRUCTURE для имен приложений

    sqlite3.ProgrammingError: Неправильное количество привязок. В текущем заявлении используется 1, и имеется 5

    Из python можно ли отслеживать назначения на уровне модуля до (другого) кода пользователя?

    python утверждает, что срабатывает с -O

    Объединить столбцы в DataFrame, которые имеют одинаковое имя

    Цепочки QSortFilterProxyModels

    Запуск пользовательского класса Java в PySpark

    Обеспечение того, чтобы моя программа не выполняла одновременную запись файла

    graph.write_pdf ("iris.pdf") AttributeError: объект 'list' не имеет атрибута 'write_pdf'

    Python – экранирование двойных кавычек с использованием string.replace

    Как получить ключ словаря как переменную непосредственно в Python (не путем поиска по значению)?

    Python - лучший язык программирования в мире.