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

时间:2016-05-31 23:24:44

标签: c++ boost

我有这样的结构

curl_setopt($ch, CURLOPT_REFERER, "http://www.fifaindex.com");

所以我有一个文件EFK.h,我需要一个struct Observation

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.cpp文件中我想使用struct的一些变量

 class EFK
 {
   public:
    Observation::Ptr observer (new Observation);
  /// Something else
 }

但是当我编译时,我得到了这个

void EFK::update (ObsVector input, ObsVector delta)
{
   /// Some stuff
   input.z = observer->z -delta.z;
}

我不知道为什么。这与boost :: shared_ptr有什么关系?

谢谢

2 个答案:

答案 0 :(得分:0)

如果您想拥有属性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(...)的语法是函数声明之一。

答案 1 :(得分:0)

我可能会错误地阅读这个问题 - 它并不完全清楚。

响应到标题 &#34;如何将结构元素作为类型shared_ptr&#34; < / strong>你可以而且应该使用共享指针的别名构造函数:

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的所有权。这意味着在p重置/销毁之前不会删除member_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";

打印

p has been reset
~Observation
member_z has been reset

现场演示

<强> Live On 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";
}