[英]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.