Каков синтаксис следования коду c ?

#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> шаблону, как вы можете заметить по оператору области видимости ::