Оператор индексации объекта, принадлежащего unique_ptr - PullRequest
2 голосов
/ 06 мая 2020

Я работаю над проектом на C ++. Мне нужно поместить в std :: vector разные классы. Я обнаружил ( Объекты разных классов в одном векторе? ), что это можно сделать, создав классы с общим типом и затем поместив указатели на вектор. В этом случае я мог бы привести указатели к нужному мне типу. Мне это ясно.

Также упоминается, что в принципе можно использовать не только указатели, но и smart_pointers, т.е. std::vector<std::unique_ptr<TMyClass>>. И здесь начинаются мои проблемы. TMyClass имеет оператор индексации (operator[]).

Допустим, у меня есть std::vector<std::unique_ptr<TMyClass>> A. Я пытаюсь получить доступ к элементу объекта TMyClass, например, A[0][0] или A[0].get()[0] или (A[0])[0], но при компиляции получаю сообщение об ошибке:

[ошибка bcc64] type 'value_type' (aka 'std :: unique_ptr <.....>') не предоставляет оператор индекса

Как я могу сказать компилятору, что второй индекс относится к объекту TMyClass, а не к unique_ptr ? Я был бы очень признателен, если бы кто-нибудь объяснил мне, как получить доступ к элементам в этом случае.

Ответы [ 2 ]

4 голосов
/ 06 мая 2020

Сначала вам нужно извлечь указатель

A[0]  //type: std::unique_ptr<TMyClass>&

Затем извлечь объект из этого указателя (указатель)

*A[0] //type: TMyClass&

И затем вы можете использовать свои перегруженные операторы для этого объекта

(*A[0])[0] 
1 голос
/ 06 мая 2020

Указатели должны быть разыменованы. Итак, я бы предположил (*A[0])[0] или A[0]->[0]. Не очень красиво, но это вам указатель

...