#c
#c
Вопрос:
Какова цель следующего кода на c LinkedList<Derived>::
? Я никогда не вижу этого синтаксиса.
template<class Derived, class List> LinkedListItem<Derived, List>::~LinkedListItem() {
if(_list) _list->LinkedList<Derived>::cut(static_cast<Derived*>(this));
}
Я пытаюсь выполнить поиск, прежде чем спрашивать, но просто ничего не могу найти. Извините, если об этом уже есть сообщение.
Комментарии:
1. Какой выделенный код, светло-синий или темно-синий?
2. Похоже, он вызывает функцию базового класса.
3. Он явно вызывает член
cut
, принадлежащийLinkedList<Derived>
.4. Именно мой вопрос, зачем нужен такой «квалификатор»? «вырезать» принадлежит _list, тип которого является типом шаблона при определении LinkedListItem .
5. Вот определение linklist и LinkedListItem, шаблон<производный класс, список классов> класс LinkedListItem { друг класса LinkedList<Производный>; … Список _list; } шаблон<класс T> класс LinkedList { public: void cut(T item) } Зачем нужно добавлять квалификатор для вызова cut из списка?
Ответ №1:
Допустим, у вас есть два класса:
struct A
{
virtual void foo() {std::cout << "Came to A::foo()n";}
};
struct B : A
{
virtual void foo() {std::cout << "Came to B::foo()n";}
};
и указатель:
A* ap = new B();
Если вы вызываете
ap->foo();
Вы будете выполнять B::foo()
. Однако, если вы хотите выполнить A::foo()
этот указатель, вы можете использовать:
ap->A::foo();
Переходим к вашему опубликованному коду,
Если вы добавите немного пробелов и разместите вещи в нескольких строках, один и тот же код будет:
template<class Derived, class List>
LinkedListItem<Derived, List>::~LinkedListItem()
{
if(_list)
_list->LinkedList<Derived>::cut(static_cast<Derived*>(this));
}
Строка
template<class Derived, class List>
указывает, что мы смотрим на шаблон класса, функцию-член шаблона класса или шаблон функции.
Строка
LinkedListItem<Derived, List>::~LinkedListItem()
указывает, что мы смотрим на деструктор шаблона класса LinkedListItem
.
Строки
if(_list)
_list->LinkedList<Derived>::cut(static_cast<Derived*>(this));
укажите, что LinkedListItem
имеет переменную-член _list
. Если переменная _list
-член не равна NULL, мы вызываем для нее некоторую функцию.
Строка
_list->LinkedList<Derived>::cut(static_cast<Derived*>(this));
кажется, указывает на то, что тип _list
имеет вызываемый шаблон базового класса LinkedList
, в котором вызывается функция-член cut
. Строка вызывает эту функцию, используя аргумент, полученный путем приведения this
к a Derived*
.
Ответ №2:
LinkedList<Derived>
это тип, и он также является scope
. ::
это оператор области видимости, который сообщает компилятору, что область cut(static_cast<Derived*>(this))
его действия находится (LinkedList).
Ответ №3:
Следующая вероятная структура: LinkedList<Derived>
реализован ли в классе шаблона связанный список Derived
объектов. Он состоит LinkedListItem<Derived, List>
из объектов, которые обтекают a Derived*
и поддерживают другие компоненты данных, относящиеся к связанному списку (указатели next, prev, указатель head и т. Д.). Каждый LinkedListItem<Derived,List>
объект также содержит указатель на LinkedList<Derived>
объект, частью которого он является. Это _list
. Итак, когда вы уничтожаете a LinkedListItem
, вы также хотите получить cut
его из исходного списка. cut
вероятно, будет изменено содержимое соседей LinkedListItem
удаляемого объекта, чтобы сохранить все LinkedList
инварианты.
Ответ №4:
LinkedList<Derived>
in _list->LinkedList<Derived>::cut(static_cast<Derived*>(this));
означает, что функция cut
принадлежит LinkedList<Derived>
шаблону, как вы можете заметить по оператору области видимости ::