Как получить доступ к методам std :: shared_ptr - PullRequest
0 голосов
/ 01 ноября 2019

все есть в названии. Я новичок в C ++, и я не уверен, что я правильно использую shared_ptr ...

У меня есть этот метод:

const std::set<Something::Ptr, b> & getSome() const;

, который я использую, чтобы получить набор чего-то:

auto s = u->second.getSome();

После этого я хочу повторить это с:

for(auto i = s.begin();i != s; s.end();i++)

//(so i=  std::shared_ptr<Something> referring to the first element in s )

Мой вопрос: как я могу получить доступ к моим методам?

Я попытался понять, с чем я работал, отладкой и couting некоторые вещи:

auto whatIsThat1 = *i;
cout << "hello" << whatIsThat1; //>> hello0x13fd500

auto whatIsThat2 = i->get();
cout << "hello" << whatIsThat2; >> hello0x21c2500

Ответы [ 3 ]

2 голосов
/ 01 ноября 2019

Я думаю, что вы смущены, потому что arretCourant - это , а не a std::shared_ptr. Это std::set итератор, ссылающийся на элемент std::set, который равен a std::shared_ptr.

Итак, чтобы вызвать метод объекта, std::shared_ptr указывает на то, что вам нужно сначала разыменовать итератор, чтобы получить ссылку на std::shared_ptr, а затем разыменовать снова, чтобы получить ссылку на объект, на который указывает std::shared_ptr. Поэтому для вызова метода для этого объекта используйте:

(*arretCourant)->methodName()

std::shared_ptr перегрузка оператора ->, чтобы он вызывал метод для объекта, на который указывает объект, а не для самого std::shared_ptr. Он также перегружает оператор косвенного обращения *, чтобы вернуть ссылку на объект, на который он указывает, поэтому

(**arretCourant).methodName()

также работает.

Если вы используете arretCourant->methodName(), вы разыменовываетеитератор, но не std::shared_ptr, поэтому вы звоните methodName() на std::shared_ptr.

1 голос
/ 01 ноября 2019

Вы можете разыменовать a shared_ptr так же, как необработанный указатель, например:

struct A{
   void method() {}
};
shared_ptr<A> a = make_shared<A>();
a->method();

Вы не должны разыменовывать, если вам нужен метод std::shared_ptr, например:

auto refCount = a.use_count();
0 голосов
/ 01 ноября 2019

У вас нет Arret::Ptr, у вас есть std::set<Arret::Ptr, compArret>::const_iterator. Вам нужно будет разыменовать его, чтобы получить указатель (и разыменовать его, чтобы получить базовый Arret)

Вы получите Arret::Ptr s, если будете использовать дальний поиск, например,

for (auto ptr : arrets)
{
    ptr->method();
}
...