2016-06-22 4 views
2

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

Я прохожу через код другого C++ («Точный геодезический для треугольных сеток» с открытым исходным кодом), и одна строка отключает меня. Во всяком случае, линия выглядит следующим образом:

geodesic::Mesh* mesh = algorithms[algorithm_id]->mesh(); 

Поправьте меня, если я ошибаюсь, но первый указатель инициализируется. Похоже, что

class::pointerclass* thingpointedto = something[something] accessing member mesh(); 

У меня нет понятия, что означает код в правой части равенства. Может кто-нибудь мне помочь?

+1

У вас есть опечатка? Указатель на оператор-член '->' ** не может иметь пробел. – Bathsheba

+1

'algorithmms' - это массив/вектор/карта (или какой-либо другой тип с перегруженным оператором []'). Он, очевидно, возвращает указатель на что-то с членом 'mesh()', который возвращает другой указатель. –

+2

'algorithm' - это массив алгоритмов. 'algorithm_id' - это индекс (число алгоритмов по всем предоставленным), поэтому вы получаете сначала данный алгоритм. Как только вы получите один алгоритм (будьте осторожны, это всего лишь указатель на алгоритм), вы просто вызываете его метод 'mesh()', который отправляет вам адрес некоторой вычислительной структуры «Geodesic :: Mesh». –

ответ

2

Взглянув на потенциал source Я бы сказал, что это std::vector<algorithm_shared_pointer>. Где algorithm_shared_pointer является typedef для boost::shared_ptr<geodesic::GeodesicAlgorithmBase>.

geodesic::Mesh* mesh = algorithms[algorithm_id]->mesh(); 

geodesic это пространство имен и Mesh класс находится в этом пространстве имен. Мы создаем указатель на этот класс. Указателю присваивается результат вызова функции mesh(), который может быть вызван geodesic::GeodesicAlgorithmBase. algorithm_id - это int, который предоставляется в качестве параметра функции, которая содержит эту строку.

Это целое число используется для выбора индекса в векторе.


Что бы привести:

namespace::pointerToClass* nameOfPointer 
    = std::vector<boost::shared_ptr<geodesic::GeodesicAlgorithmBase>>[int]->mesh(); 

Который является нечетным кусок кода, учитывая, что мог бы использовать auto из-за типа mesh() возвращение быть geodesic::Mesh*.

2
geodesic::Mesh* mesh = algorithms[algorithm_id]->mesh(); 

Здесь algorithms может быть либо тип:

  • указатель массива, в этом случае он индексируется с помощью интегрального целочисленного типа, algorithm_id
  • Последовательный контейнер с перегрузка operator[], например std:vector, которая индексируется целым целочисленным типом, algorithm_id
  • Ассоциация содержит г с перегруженным operator [], например std::map, что индексируется с ключевым объектом типа, algorithm_id
  • пользовательского типа с перегруженной operator [], индексируется с пользовательским типом объектом, algorithm_id как продиктовано его подписью

array[] access возвращает указатель (обычный или умный указатель) на объект, который имеет функцию-член mesh(), которая возвращает указатель на объект geodesic::Mesh.

Возвращаемое значение algorithms[algorithm_id] не binded ни к чему, скорее, провел в качестве временного (если его уже не ссылка); то его функция-член, mesh() называется

Смежные вопросы