Структура 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 может быть в себе, я никогда не видел это прежде и не вполне понимаю это. Что это означает, и если бы кто-то может, каков был бы эквивалентный Python?

8
задан tomlogic 21 May 2010 в 21:48
поделиться

8 ответов

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

class Foo {
public:
    Foo() {}

    Foo *anotherFoo;
};   

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

1
ответ дан 5 December 2019 в 05:03
поделиться

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

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

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

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

0
ответ дан 5 December 2019 в 05:03
поделиться

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

19
ответ дан 5 December 2019 в 05:03
поделиться

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

struct linked_list_node { 
    int data; 
    struct linked_list_node *next; // <- self reference 
}; 
0
ответ дан 5 December 2019 в 05:03
поделиться

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

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

0
ответ дан 5 December 2019 в 05:03
поделиться

Это.

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)

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

11
ответ дан 5 December 2019 в 05:03
поделиться

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

0
ответ дан 5 December 2019 в 05:03
поделиться

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

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


|------------------ huffnode_s* zero - 4 байта --------------|

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

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

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


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

4
ответ дан 5 December 2019 в 05:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: