【问题标题】:How can I get elements of a struct as a type boost::shared_ptr如何将结构的元素作为 boost::shared_ptr 类型获取
【发布时间】:2016-06-02 03:05:32
【问题描述】:

我有一个这样的结构

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 我需要一个 struct Observation

 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 有关系吗?

谢谢

【问题讨论】:

  • 我认为这与Observation::Ptr observer (new Observation); 声明一个函数而不是一个变量有关。 (虽然这对我来说看起来像是一个无效的函数声明)
  • @immibis Clang 的“尝试修复它并继续运行”以获取更明智的错误消息的政策似乎是这里的罪魁祸首。 melpon.org/wandbox/permlink/ot3kY4jkk17ch7Lk

标签: c++ boost


【解决方案1】:

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

【讨论】:

  • 语法。今日双关语
  • 你说了什么? xD
  • 您不能执行选项 1。boost::shared_ptr 没有用于普通指针的重载赋值运算符(即。boost::shared_ptr&lt;Type&gt; ptr = new Type; 是语法错误。)但第二个选项有效。跨度>
【解决方案2】:

我可能读错了这个问题 - 它并不完全清楚。

响应只是标题“我如何将结构的元素作为类型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 的所有权。这意味着pmember_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";
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 2011-04-22
    • 1970-01-01
    • 2016-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多