2016-09-11 2 views
0

Извините, если заголовок не имеет смысла. Я не знаю, как сказать это, поскольку я довольно новичок в C++. В принципе у меня есть это:Элемент структуры класса доступа C++ с использованием указателя массива

sf::VertexArray *vArray; 

Если я хочу, чтобы получить доступ к position внутри, я должен был бы сделать это:

(*vArray)[0].position = ...; 

Есть ли способ использовать стрелки обозначение вместо этого? Почему я не могу это сделать: vArray[0]->position = ...;?

Любая помощь будет оценена!

EDIT: sf::VertexArray является частью библиотеки SFML: https://github.com/SFML/SFML/blob/master/src/SFML/Graphics/VertexArray.cpp

+1

Поскольку 'vArray' имеет тип' sf :: VertexArray * ',' vArray [0] 'является просто встроенной арифметикой указателя и имеет тип' sf :: VertexArray'. У этого типа нет 'operator->', и поэтому вы не можете сделать '-> position' на нем. Даже если у него был оператор 'sf :: Vertex * ->()', предположительно, он был бы реализован для возврата указателя на первую вершину в VertexArray, поэтому его использование было бы весьма ограниченным. Я ожидаю, что это не предусмотрено. –

+0

Спасибо, теперь это немного лучше. – syy

+0

Если у вас есть десятки строк, которые используют ** (* vArray) ** внутри блока, вы можете переустановить его как ссылку и использовать эту ссылку (будьте осторожны, чтобы не ** удалить ** указатель vArray до конца блока) * pvi = новый вектор (2,100); vector & vref = (* pvi); cout << vref [0] << endl; cout << vref [1] << endl; – blackpen

ответ

3

Если исходная линия

(*vArray)[0].position = ...; 

правильно иллюстрирует семантику вашей структуры данных, то основанное аналог -> будет

vArray->operator [](0).position = ...; 

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

В качестве альтернативы, вы можете заставить -> в это выражение, как

(&(*vArray)[0])->position = ...; 

, но это не имеет большого практического смысла.

Вы можете даже объединить два

(&vArray->operator [](0))->position = ...; 

прибыть на что-то еще более запутанных и бессмысленно.

В любом случае, почему вы хотите иметь -> в этом выражении? Чего вы пытаетесь достичь?

+0

Спасибо за объяснение. Я просто пытался установить «позицию». Я довольно новичок в C++, поэтому не знаю, как работает большинство синтаксисов; особенно для указателей. – syy

+0

@AnT, хороший синтаксический описание. – blackpen

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