繁体   English   中英

如何获取结构的元素作为类型boost :: shared_ptr

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

现场演示

生活在Coliru

#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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM