Johnnylin Johnnylin - 3 months ago 17
C++ Question

boost::shared_ptr of a class as a struct member

I have the following files.

a.h:

#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;
}


What I want to do is to use a struct to store the pointer of class A instance. But I cannot resolve the relationship between these files. Can someone give me some ideas ?

UPDATE:

The problem is, when I compile these files. I got

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


UPDATE:

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

Answer
A a_tmp;
a_tmp.somefunction();

This will not work. Since A::someFunction calls shared_from_this, there must exist at least one shared_ptr to any A object on which you call someFunction. Change this to:

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