#c #struct #add #decorator
#c #структура #Добавить #декоратор
Вопрос:
Добрый день. Я занят написанием кода для проекта в университете, и я хотел бы знать, как я могу добавить элемент данных в структуру узла (для связанного списка), но структура была определена ранее. Я не могу просто определить все это в исходной структуре, поскольку в инструкциях указано иное.
Вот моя структура, расположенная в файле ListAsSSL.h:
struct node
{
node* next;
Object obj;
};
Могу ли я сделать это в другом заголовочном файле:
struct node: node
{
node* previous;
};
Спасибо. Я только что самостоятельно изучил шаблон декоратора, но он показывает только, как это делать с классами, а не со структурами.
Спасибо за помощь. Ричард
Комментарии:
1. Классы и структуры — это одно и то же, но только с разным доступом.
2. Нет, вы не можете этого сделать. Вместо этого используйте наследование.
3. нет, вы не можете, это переопределение
4. Вам нужно реализовать что-то вокруг существующей структуры (предоставленной вашим инструктором)? Потому что, если это так, я думаю, что вы пытаетесь сделать это неправильно.
5. Учитывая определение оригинала
node
с тем, что выглядит как универсальный элемент «Object», было бы очень странно добавлятьprevious
поле через наследование или что-то еще.next
иprevious
очень симметричны. Прежде чем приступить к этому, вам, вероятно, следует уточнить инструкции у своего инструктора. Может быть, они имели в виду, что вы не должны были вносить измененияObject
, и что оригиналnode
является примером того, как это сделать?
Ответ №1:
Нет, вы не можете расширить struct
подобное. Вместо этого создайте новый struct
с наследованием, например:
struct node
{
node* next;
Object obj;
};
И в вашем другом файле:
struct newNode: node
{
node* previous;
};
И в вашем клиентском коде, коде, который обращается к структуре, вы должны использовать новую структуру вместо старой. Помните, именно для этого во многих случаях и создавалось наследование: для добавления дополнительных возможностей к существующему классу!
Комментарии:
1. @NathanOliver доступ по умолчанию является общедоступным для структур, нет?
2. Мне это кажется неправильным, вот упрощенный пример @NathanOliver
3. @tobi303 Durp. struct не класс. nvm me
4. Если производным типом является a
class
, база не виднаpublic
. Но если мы просто придерживаемсяstruct
, то всеpublic
по умолчанию. Итак, ответ верен. (И теперь я собираюсь прекратить писатьpublic
в тех редких случаях, когда я использую наследование!)5. Большое вам спасибо, я задавался вопросом, смогу ли я сделать это так, но я подумал, что это неправильно. Спасибо!
Ответ №2:
Можете ли вы создать новую структуру? Например:
struct nodeV2
{
Object obj;
nodeV2* next;
nodeV2* previous;
};
Мне кажется, это самый простой способ. Таким образом, вы можете сохранить исходную структуру, не вступая в наследование.
Всего наилучшего.
Комментарии:
1. Это нарушает принцип связанного списка. не
next
должен ли иprevious
иметь типnodeV2
?2. С моей стороны это была ошибка копирования-вставки. Мой плохой! Спасибо за указатель. Я исправил проблему, следуя вашему совету.