我有这样的结构
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有什么关系?
谢谢
答案 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";
}