Использование указателя «This» в c ++ - PullRequest
1 голос
/ 23 сентября 2010

Я читал об указателе "this" на различных сайтах (например, в руководствах MSDN) и понимаю его основное использование - возвращение копии вашего собственного объекта или использование его указателя для возврата / сравнения.

Но я сталкивался с этим утверждением:

  // Return an object that defines its own operator[] that will access the data.
  // The temp object is very trivial and just allows access to the data via 
  // operator[]
  VectorDeque2D_Inner_Set<T> operator[](unsigned int first_index) { 
    return VectorDeque2D_Inner_Set<T>(*this, first_index);
  }

Что это делает?Увеличивает ли он каким-либо образом оператор this, и если да, то почему ??

(Это происходит из примера, который я привел при переполнении стека, поэтому в синтаксисе могут быть ошибки. Дайте мне знать, если больший кусокнеобходимо, я могу вставить больше кода.)


РЕДАКТИРОВАТЬ 1
Вот весь список, для получения дополнительной информации.Функция находится в нижней части класса.Примечание. Я переименовал переменную из x в index и переименовал шаблонный внутренний класс.Я забыл поместить типовое преобразование в шаблонный внутренний класс, который я добавил в этом обновлении.

Есть идеи сейчас?

template <typename T>
class Container
{
private:
    // ...


public:

    // Proxy object used to provide the second brackets
    template <typename T>
    class OperatorBracketHelper
    {
        Container<T> & parent;
        size_t firstIndex;
    public:
        OperatorBracketHelper(Container<T> & Parent, size_t FirstIndex) : parent(Parent), firstIndex(FirstIndex) {}

        // This is the method called for the "second brackets"
        T & operator[](size_t SecondIndex)
        {
            // Call the parent GetElement method which will actually retrieve the element
            return parent.GetElement(firstIndex, SecondIndex);
        }

    }

    // This is the method called for the "first brackets"
    OperatorBracketHelper<T> operator[](size_t FirstIndex)
    {
        // Return a proxy object that "knows" to which container it has to ask the element
        // and which is the first index (specified in this call)
        return OperatorBracketHelper<T>(*this, FirstIndex);
    }

    T & GetElement(size_t FirstIndex, size_t SecondIndex)
    {
        // Here the actual element retrieval is done
        // ...
    }
}

Ответы [ 3 ]

5 голосов
/ 23 сентября 2010

Оператор * разыменовывает указатель this.Это необходимо, поскольку вызываемый метод (конструктор OperatorBracketHelper(Container<T> & Parent, size_t FirstIndex)) требует ссылки, а не указателя.

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

4 голосов
/ 23 сентября 2010

Ключевое слово this в основном является указателем на объект, который используется в данный момент.В C ++ этот является указателем, поэтому для разыменования его используйте *this.

Итак, этот код,

return VectorDeque2D_Inner_Set<T>(*this, index);

, возвращает новый VectorDeque2D_Inner_Set путем передачиразыменовывает себя (поскольку конструктор хочет ссылку на объект, а не адрес указателя).

Этот метод

 // This is the method called for the "first brackets"
    OperatorBracketHelper<T> operator[](size_t FirstIndex)
    {
        // Return a proxy object that "knows" to which container it has to ask the element
        // and which is the first index (specified in this call)
        return OperatorBracketHelper<T>(*this, FirstIndex);
    }

только что передал разыменованную self в конструктор OperatorBracketHelper, поскольку в качестве параметра требуется Container&.

1 голос
/ 23 сентября 2010

создает экземпляр OpBracketHelper со ссылкой на текущий контейнер в качестве его родительского элемента (* передает ссылку на объект контейнера в конструктор)

Мое единственное беспокойство связано с продолжительностью жизни Контейнера и вспомогательного объекта. Я бы соблазнился использовать shared_ptr, а не ссылку

...