如何访问 std::shared_ptr 方法

How to access std::shared_ptr methods

一切都在标题中。 我是 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 )

我的问题是如何访问我的方法?

我试图通过调试和计算一些东西来了解我正在使用的东西:

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

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

您可以像原始指针一样取消引用 shared_ptr,例如:

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

如果您需要 std::shared_ptr 的方法,则不应取消引用,例如:

auto refCount = a.use_count();

我觉得你很困惑,因为 arretCourant 而不是 std::shared_ptr。它是一个 std::set 迭代器,指向 std::set 的一个元素, 一个 std::shared_ptr.

所以为了在 std::shared_ptr 指向的对象上调用方法,您需要首先取消引用迭代器以获取对 std::shared_ptr 的引用,然后再次取消引用以获取引用 std::shared_ptr 指向的对象。因此,要调用该对象的方法,请使用:

(*arretCourant)->methodName()

std::shared_ptr 重载 -> 运算符,使其调用指向的对象上的方法,而不是 std::shared_ptr 本身。它还将间接运算符 * 重载为 return 对它指向的对象的引用,因此

(**arretCourant).methodName()

也有效。

如果您使用 arretCourant->methodName(),您将取消对迭代器的引用,而不是 std::shared_ptr,因此您将在 std::shared_ptr 本身上调用 methodName()

您没有 Arret::Ptr,您有 std::set<Arret::Ptr, compArret>::const_iterator。您将需要取消引用它以获取指针(并取消引用以获取底层 Arret

如果你使用范围 for,你会得到 Arret::Ptrs,例如

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