[英]How can I get elements of a struct as a type boost::shared_ptr
我有這樣的結構
struct Observation
{
observation_id id;
ObsVector z;
ObsMatrix R;
double confidence;
typedef boost::shared_ptr<Observation> Ptr;
typedef boost::shared_ptr<const Observation> ConstPtr;
};
所以我有一個文件EFK.h,我需要一個結構觀察
class EFK
{
public:
Observation::Ptr observer (new Observation);
/// Something else
}
因此,在EFK.cpp文件中,我想使用結構的一些變量
void EFK::update (ObsVector input, ObsVector delta)
{
/// Some stuff
input.z = observer->z -delta.z;
}
但是當我編譯時我得到了
*error: invalid use of member function (did you forget the ‘()’ ?)
input.z = observer->z - delta.z;*
^
而且我不知道為什么。 這與boos :: shared_ptr有關嗎?
謝謝
如果要為屬性observer
具有默認值,請輸入:
class EFK
{
public:
Observation::Ptr observer = new Observation;
/// Something else
};
要么:
class EFK
{
public:
EFK() : observer(new Observation)
{}
Observation::Ptr observer;
/// Something else
};
Type name(...)
的語法是一種函數聲明。
我可能會看錯這個問題-尚不完全清楚。
僅響應標題“如何將結構的元素獲取為shared_ptr
類型”標題,您可以並且應該使用共享指針的別名構造函數:
Observation::Ptr p = std::make_shared<Observation>();
// take shared_ptr to a **member** of p
std::shared_ptr<ObsVector> member_z(p, &p->z);
這為p
共享了shared_ptr的所有權。 這意味着在member_z
被重置/銷毀之前,不會刪除p
:
p.reset(); // Observation stays alive
std::cout << "p has been reset\n";
member_z.reset(); // destructor of Observation runs now!
std::cout << "member_z has been reset\n";
打印
p has been reset
~Observation
member_z has been reset
#include <memory>
#include <iostream>
struct ObsVector {
double x,y,z;
ObsVector operator-(ObsVector const& o) const { return { x-o.x, y-o.y, z-o.z }; }
};
struct Observation
{
~Observation() { std::cout << __FUNCTION__ << "\n"; }
ObsVector z;
typedef std::shared_ptr<Observation> Ptr;
};
int main() {
Observation::Ptr p = std::make_shared<Observation>();
// take shared_ptr to a **member** of p
std::shared_ptr<ObsVector> member_z(p, &p->z);
p.reset(); // Observation stays alive
std::cout << "p has been reset\n";
member_z.reset(); // destructor of Observation runs now!
std::cout << "member_z has been reset\n";
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.