Общая переменная для списка? - PullRequest
0 голосов
/ 06 ноября 2010

Эту проблему немного сложно описать, поэтому терпите меня, если она не ясна.

Я хочу реализовать двусвязный список с одним, универсально доступным [для элементов внутри]Указатели Head, End и Iter - это значительно уменьшит накладные расходы памяти и время обработки / доступа ...

Статический почти выполняет эту роль - за исключением того, что он совместно используется all классы одного типа - чего я не хочу [поскольку у меня может быть несколько списков с двойной связью - мне нужен один для каждого списка, а не один для каждого класса].Так что мне нужно что-то похожее на статическое, за исключением того, что оно локализовано для разных объявлений.

Методы Head / Node усложняются (особенно потому, что они используют шаблоны), и я хочу избежать этого любой ценой.У Head просто заканчиваются дублирующие функции Node [поэтому Node доступен], что кажется пустой тратой и сложностью, просто имея три локально-универсальные переменные.

То, что я хотел бы, выглядит примерно так:

class Test
{
 private:
  static Test *Head; //Single universal declaration!
  static Test *End;
  static Test *Iter;
 //etc etc
};

Кроме ...

Test A; //Set of 'static' variables 'unique' to A
Test B; //Set of 'static' variables 'unique' to B

Я готов принять любые и все решения проблемы, но, пожалуйста, избегайте сложных решений - это должно быть улучшением и должно бытьбыстрый и простой в реализации.

Дополнительная информация [по запросу]: Сам по себе «проблемы» нет [за исключением случаев, когда нужно избегать накладных расходов и проектирования] - это настройкарамки / основы для нескольких других классов / функций, на которых можно основываться.Таким образом, класс должен иметь возможность обрабатывать несколько ролей / переменных / классов - для этого он должен быть шаблонным (хотя это не совсем актуально).

Одна [из многих] его основных ролейхранение отдельных символов [загруженных из файлов] в отдельных узлах.Учитывая размер может варьироваться, он должен быть динамическим.Однако, поскольку одна из его ролей включает загрузку из файлов, он не может быть массивом [поскольку чтение файла для определения количества аргументов, символов и т. Д. Вызывает узкие места жесткого диска / доступа].Итак ...

... Односвязные списки позволят [легко] добавлять [в список] персонажа при каждом проходе, который получает символ [и учитывается одновременно - решение двух задачв одной].Проблема заключается в том, что списки с односвязными ссылками очень трудно [безопасно] удалить, а навигация - это один из способов.Что является проблемой, так как это препятствует функциональности поиска, и, в частности, предполагаемой многоцелевой роли ...

... Таким образом, вывод состоит в том, что это должен быть двусвязный список.Мне не нравятся STL или стандартные списки, поскольку я понятия не имею об их эффективности или безопасности, а также о совместимости с дополнительными функциями, которые должен поддерживать класс.Так что это должен быть пользовательский DL-список ...

... Однако я ранее (некоторое время назад) реализовал метод Head / Node - он работал.Однако это становится сложным и трудным для отладки, так как Head и Node разделяют функции.На этот раз я просто хочу простой, сингл [Читаемый!Это будет общий класс!], Который каким-то образом обходит почти «изящную» природу C ++.Это означает, что нет затрат на копирование Head / Iter / End (и все необходимые для этого функции / переменные / отладка) и отсутствие системы Head с ее дублированием ...

... Static - самое близкое, что я получаю.Возможно, есть какой-то способ: у вас есть класс A, в котором хранятся три переменные, и класс B, в котором хранится список, - и оба они осведомлены друг о друге и могут общаться через какой-то метод / функцию (без хранения указателя)!) ...

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

Ответы [ 2 ]

3 голосов
/ 06 ноября 2010

Если статические переменные не подходят, у вас есть только одна возможность - использовать переменные экземпляра.

Если вы хотите разделить переменные между элементами, поместите их в сам список и ведите указатель на списокв каждом пункте следующим образом:

class List
{
    Item* head;
    Item* end;
    Item* iter;
};

class Item
{
    List* list;
};
0 голосов
/ 06 ноября 2010

Создайте класс List (как уже показано vitaut, но добавьте функцию makeEntry (), в которой можно передать ссылку на класс List. Если List станет более сложным, я бы изолировал эти члены от ListInfo, поэтому узелиметь к ним доступ только

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