如何访问 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::Ptr
s,例如
for (auto ptr : arrets)
{
ptr->method();
}
一切都在标题中。 我是 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::Ptr
s,例如
for (auto ptr : arrets)
{
ptr->method();
}