类的 boost::shared_ptr 作为结构成员

Posted

技术标签:

【中文标题】类的 boost::shared_ptr 作为结构成员【英文标题】:boost::shared_ptr of a class as a struct member 【发布时间】:2016-08-17 11:39:08 【问题描述】:

我有以下文件。

啊哈:

#ifndef __A__
#define __A__

#include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>

class A: public boost::enable_shared_from_this<A>

public:
 void somefunction();

;


#endif

a.cpp:

#include "a.h"
#include "b.h"

void A::somefunction()

    Node new_node;
    new_node.id_ = 1;
    new_node.ptr = shared_from_this();
    C* c = C::GetInstance();
    c->addNode(new_node);

b.h:

#ifndef __B__
#define __B__

#include "a.h"
#include <vector>

typedef boost::shared_ptr<A> a_ptr;

struct Node
    size_t id_;
    a_ptr ptr;
;

class C 

public:

    static C *GetInstance()
        if(m_pInstance == nullptr)
            m_pInstance = new C();
            
        return m_pInstance;
    

    void addNode(Node& node);

    void show();
private:

    static C* m_pInstance;
    std::vector<Node> nodes_;
;


#endif

b.cpp:

#include "b.h"
#include <iostream>

C* C::m_pInstance = nullptr;

void C::addNode(Node& node)

    nodes_.push_back(node);



void C::show()

    for(size_t i=0; i< nodes_.size(); i++)
        if(nodes_[i].ptr != nullptr) 
            std::cout << nodes_[i].id_ << " " << "pointer not null" << std::endl;
    


main.cpp:

#include "a.h"
#include "b.h"

int main()

    A a_tmp;
    a_tmp.somefunction();
    C* c_tmp = C::GetInstance();
    c_tmp->show();

    return 0;

我想做的是使用一个结构来存储A类实例的指针。但我无法解决这些文件之间的关系。有人可以给我一些想法吗?

更新:

问题是,当我编译这些文件时。我得到了

In b.h, error: ‘A’ was not declared in this scope typedef boost::shared_ptr<A> a_ptr;

更新:

terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::bad_weak_ptr> >'

【问题讨论】:

“我无法解析这些文件之间的关系”是什么意思?究竟是什么问题? 看来你不见了;在类和结构之后。 我的水晶球说你有一个圆形包括你没有显示。除非您发布 minimal reproducible example,否则我们无法确定。 @Johnnylin - 现在,如果没有包括警卫,你有两倍的 a.h 停下!您显然没有将实际代码复制并粘贴到 SO 中。您正在重新输入它“以仅显示相关位”。 (我们知道这一点是因为您最初的问题有错别字,而 C&P 代码中不会出现这种错别字)。仅显示相关位是非常值得的(我们不会查看 10,000 行代码库),但您遗漏的位实际上是您的问题的原因。您需要做的是编写实际的 a.h、b.h、a.cpp 文件并编译它们。然后,当您收到编译错误时,将这些文件复制并粘贴到您的问题中。 【参考方案1】:
A a_tmp;
a_tmp.somefunction();

这行不通。由于A::someFunction 调用shared_from_this,因此在您调用someFunction 的任何A 对象中必须至少存在一个shared_ptr。将其更改为:

boost::shared_ptr<A> a_tmp(boost::make_shared<A>());
a_tmp->someFunction();

【讨论】:

解决了这个问题。谢谢。对了,上面的例子中,没有循环包含头文件的问题? @Johnnylin 您没有两个相互包含的头文件,所以没有。循环包含问题通常会导致编译失败,而不是运行时错误。

以上是关于类的 boost::shared_ptr 作为结构成员的主要内容,如果未能解决你的问题,请参考以下文章

boost shared_ptr 初始化为类成员

返回 boost::shared_ptr 和从返回的原始指针构造 boost::shared_ptr 有啥区别?

boost库之内存管理shared_ptr

Boost智能指针——shared_ptr

boost::shared_ptr与定制删除器

boost: 使用自定义删除器序列化 shared_ptr