C Добавление элемента данных в структуру из другого базового класса

#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. С моей стороны это была ошибка копирования-вставки. Мой плохой! Спасибо за указатель. Я исправил проблему, следуя вашему совету.