簡體   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