Как разрешить вашей структуре данных принимать объекты любого класса - C ++ - PullRequest
3 голосов
/ 03 февраля 2010

Как мне это сделать? Как вы знаете в Java, вы можете использовать ArrayList, и он займет любой объект, если вы приведете его к тому, что есть, когда вы извлекаете объект.

Более того, вы можете указать, какой класс объектов будет хранить ArrayList, выполнив ...

new ArrayList ()

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

Сейчас я просто использую ...

typedef whatObject ItemType

в начале моего заголовочного файла для моего связанного списка и затем манипулирования «ItemType» в течение реализации связанного списка. Поэтому каждый раз, когда я хочу изменить тип, например, вместо того, чтобы использовать список для хранения строк, я хочу сохранить int, мне придется изменить typedef в заголовке моего связанного списка, но я хочу иметь возможность просто использовать его для любого объекта, так что ...

Как?!

Спасибо.

Ответы [ 4 ]

6 голосов
/ 03 февраля 2010

Шаблоны - это ответ на ваш вопрос.

Определите свой связанный список следующим образом:

template<typename ItemType>
class ArrayList
{
  // What's inside your class definition does not need to be changed
  // Include your method definitions here and you'll be fine
};

Тип для использования будет ArrayList<WhateverObject>.

5 голосов
/ 03 февраля 2010

Используйте шаблоны. Это многое объяснить, поэтому я просто дам вам ссылку, где это объясняется гораздо лучше, чем я когда-либо смогу сделать здесь: C ++ FAQ - Шаблоны .

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

4 голосов
/ 03 февраля 2010

Если я хорошо понял, что вы спрашиваете, шаблоны - это то, что вы хотите.

Взгляните сюда:

http://www.cplusplus.com/doc/tutorial/templates/

2 голосов
/ 03 февраля 2010

В Java вы можете сделать это, потому что все классы наследуются от одного базового класса Object. В С ++ у вас его нет. Причина в том, что базовый класс Object накладывает накладные расходы на все объекты, в то время как C ++ не любит ненужных накладных расходов. Если вы хотите сохранить какой-либо объект - вы можете хранить тип данных «void *». Остался вопрос - что вы сможете делать с объектами, не зная типа? Если вы знаете - вы можете привести к нужному типу и использовать его. Описанная выше практика небезопасна, и шаблоны в большинстве случаев лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...