Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
3 / 2 / 1
Регистрация: 15.11.2020
Сообщений: 34

как через shared_ptr получить operator[] объекта?

20.11.2020, 14:05. Показов 2481. Ответов 14

Студворк — интернет-сервис помощи студентам
добрый день!

изучаю умные указатели. подскажите, а как быть с вот таким, я написал примерно такое:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class Class {
private:
    std::shared_ptr<Type> Ptr;
public:
    Class() {
        Ptr.reset(&(Some->Get()));
        Ptr->MethodA(...); // ok
        Ptr[0].MethodB(...); // error
        Ptr->[0].MethodB(...); // error
        Ptr.get()[0].MethodB(...); // error
        Ptr->operator[0].MethodB(...); // error
    }
}
здесь
  • Type - это некоторый чужой тип (класс);
  • Some - это shared_ptr на некоторый уже существующий объект (класс);
  • Get - это метод возвращающий Type;
  • MethodA - это метод Type, работает нормально;
  • MethodB - это то что мне нужно вызвать, но оно доступно только через Type[int];

спасибо!

Добавлено через 2 минуты
и может ещё я какие-то ошибки допустил? нужно ли было Some->Get() в скобки оборачивать для &, или как оно должно понимать?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.11.2020, 14:05
Ответы с готовыми решениями:

shared_ptr operator=
error: no match for 'operator=' (operand types are 'std::shared_ptr&lt;Node&gt;' and 'std::shared_ptr&lt;LogicalOperationNode&gt;') Вот такая ошибка,...

Operator[] в unique_ptr, shared_ptr
Привет. У меня в main-е создается двумерный массив char **array; который я передаю во множество различных функций - func(char**&amp;). Во...

Как получить ширину объекта через переменную?
Здравствуйте! Как получить ширину объекта, префаба?

14
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
20.11.2020, 14:12
Цитата Сообщение от WillyM Посмотреть сообщение
как через shared_ptr получить operator[] объекта?
начиная с C ++ 17
1
 Аватар для igorrr37
2882 / 2029 / 992
Регистрация: 21.12.2010
Сообщений: 3,782
Записей в блоге: 9
20.11.2020, 14:15
Лучший ответ Сообщение было отмечено WillyM как решение

Решение

C++
1
ptr->operator[](0)
1
3 / 2 / 1
Регистрация: 15.11.2020
Сообщений: 34
20.11.2020, 14:18  [ТС]
спасибо, только у меня C++11... и там не массив, а класс в котором такой оператор переопределён.

Добавлено через 27 секунд
ой... а вот это кажется приняло)

Добавлено через 46 секунд
хм... оно никак не ругалось на Ptr.reset(&(Some->Get())); пока не попытался скомпилировать...
теперь ни со скобками ни без скобок не хочет:
Ошибка C2102 для "&" требуется левостороннее значение
0
фрилансер
 Аватар для Алексей1153
6455 / 5657 / 1129
Регистрация: 11.10.2019
Сообщений: 15,070
20.11.2020, 14:35
WillyM, попробуй так

C++
1
(&*ptr)[0]
Добавлено через 3 минуты
Ptr.reset(&(Some->Get()));
выглядит опасненько. Что есть у тебя Some->Get() ?

Добавлено через 1 минуту
вообще, такое острое ощущение, что тип нужен такой

std::shared_ptr<std::vector<Type>> Ptr;

а все эти изыски с оператором [] - ошибка проектирования

Добавлено через 1 минуту
Цитата Сообщение от WillyM Посмотреть сообщение
оно никак не ругалось на Ptr.reset(&(Some->Get())); пока не попытался скомпилировать
текстовый редактор и не умеет ругаться, ругается компилятор ))
0
3 / 2 / 1
Регистрация: 15.11.2020
Сообщений: 34
20.11.2020, 14:39  [ТС]
не, так уже не принимает...

Добавлено через 2 минуты
ну он подчёркивал красным строки с 8 по 11 - над ними я и возился.
а строку 6 почему-то не подчёркивал, пока я не исправил как подсказал igorrr37 и не нажал компиляцию.

Добавлено через 2 минуты
Some - это shared_ptr на некоторый уже существующий объект (класс);
Get - это метод возвращающий Type;
то есть это некий метод, возвращающий Type, и я хотел его хранить в shared_ptr<Type>.
0
фрилансер
 Аватар для Алексей1153
6455 / 5657 / 1129
Регистрация: 11.10.2019
Сообщений: 15,070
20.11.2020, 14:50
Цитата Сообщение от WillyM Посмотреть сообщение
ну он подчёркивал красным


Цитата Сообщение от WillyM Посмотреть сообщение
не, так уже не принимает...
что именно не принимает?
C++
1
2
3
4
5
6
7
8
9
10
#include <memory>
 
int main()
{
    std::shared_ptr<int> ptr(new int[10]);
    
    (&*ptr)[0]=0;
 
    return 0;
}
но тут у меня ошибка - деструктор неправильно удалит массив блок памяти. Исправлять лень, потому что всё это вообще неправильно

Добавлено через 3 минуты
Цитата Сообщение от WillyM Посмотреть сообщение
то есть это некий метод, возвращающий Type, и я хотел его хранить в shared_ptr<Type>.
сделай просто копию, не нужно тут магии с указателями
0
3 / 2 / 1
Регистрация: 15.11.2020
Сообщений: 34
20.11.2020, 14:52  [ТС]
а зачем мне вектор? мне требуется ровно один объект Type, не больше, не меньше.
просто его можно правильно инициализировать/создать только через Some->Get().
сначала я и пытался хранить как просто Type, но при освобождении случалось неведомое.
0
фрилансер
 Аватар для Алексей1153
6455 / 5657 / 1129
Регистрация: 11.10.2019
Сообщений: 15,070
20.11.2020, 14:54
Цитата Сообщение от WillyM Посмотреть сообщение
а зачем мне вектор
я это предлагал до того, как выяснились подробности

Цитата Сообщение от WillyM Посмотреть сообщение
сначала я и пытался хранить как просто Type, но при освобождении случалось неведомое.
это уже вопрос к устройству типа Type
0
3 / 2 / 1
Регистрация: 15.11.2020
Сообщений: 34
20.11.2020, 15:36  [ТС]

Не по теме:

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


в любом случае, на сам вопрос темы уже ответили, остальное уже не по теме, большое спасибо!
0
фрилансер
 Аватар для Алексей1153
6455 / 5657 / 1129
Регистрация: 11.10.2019
Сообщений: 15,070
20.11.2020, 15:39
WillyM, когда случается неведомо-необъяснимо-мистическое, первым делом нужно совершить полный ребилд
0
3 / 2 / 1
Регистрация: 15.11.2020
Сообщений: 34
20.11.2020, 15:41  [ТС]
точно, у меня этот проект разбит на много файлов - тренируюсь с этим - наверное оно что-то старое подхватило вот и вылазило?
0
фрилансер
 Аватар для Алексей1153
6455 / 5657 / 1129
Регистрация: 11.10.2019
Сообщений: 15,070
20.11.2020, 15:46
WillyM, если студия, то там выключи precompiled headers - с ними часто такой глюк бывает. Без них - редко, намного-намного реже. Но бывает
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
20.11.2020, 15:47
Цитата Сообщение от WillyM Посмотреть сообщение
Ptr[0].MethodB(...); // error
        Ptr->[0].MethodB(...); // error
        Ptr.get()[0].MethodB(...); // error
        Ptr->operator[0].MethodB(...); // error
C++
1
2
3
4
5
6
7
8
9
        std::shared_ptr<std::vector<int>> sp(new std::vector<int>{1, 2, 3});
        std::cout << (*sp)[0] << std::endl;
        std::cout << (*sp)[1] << std::endl;
        std::cout << (*sp)[2] << std::endl;
 
        std::shared_ptr<int[]> sp2(new int[3]{4, 5, 6});
        std::cout << sp2[0] << std::endl;
        std::cout << sp2[1] << std::endl;
        std::cout << sp2[2] << std::endl;
1
фрилансер
 Аватар для Алексей1153
6455 / 5657 / 1129
Регистрация: 11.10.2019
Сообщений: 15,070
20.11.2020, 15:51
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
std::shared_ptr<int[]>
вот, синтаксис для массива я и забыл )

Но у ТС не проканает, раз C++11 у него
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.11.2020, 15:51
Помогаю со студенческими работами здесь

Как получить значения полей объекта класса через арибуты
Предположим, мне нужно вывести на экран 1 Jack 2 Jill при помощи метода статического класса GenerateJson. Никак не могу понять как мне это...

Как получить вычисляемое поле при создании объекта через DRF?
Добрый день, уважаемые. Подскажите, пожалуйста, как мне в методе create создать вычисляемое поле? Ну то есть при получении данных из...

Вызов operator[] через operator[] const
Перелистывал Майерса, наткнулся на код, подскажите пожалуйста почему он советует закомментированный вариант кода, не проще сделать как...

Реализация operator + через operator +=
внутри следующей темы возник вопрос, ответ на который так и не был получен: ...

Получить содержимое объекта через переменную с его именем
Привет всем. Есть несколько объектов (можно считать что текстовые переменные) myXML1, myXML2 Хочу сделать универсальную функцию поиска...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru