Я пытаюсь использовать share_from_this для получения shared_pointer экземпляра, но получаю ошибку bad_weak_ptr. Я читал, что он возникает, когда в instace нет shared_ptr, перед вызовом share_from_this. Но я думаю, что это не мой случай.
Это мой код: у меня есть класс Base и классы Directory и File, которые от него наследуются. Только каталог наследуется от enable_share_from_this.
DIRECTORY.H
using namespace std;
class Directory: public Base, enable_shared_from_this<Directory>{
public:
std::vector<std::shared_ptr<Base>> children;
std::weak_ptr<Directory> parent;
std::weak_ptr<Directory> self;
static std::shared_ptr<Directory> root;
static shared_ptr<Directory> makeDirectory(std::string name, std::weak_ptr<Directory> parent);
static shared_ptr<Directory> getRoot();
shared_ptr<Directory> addDirectory(string name);
void ls(int indent) const override;
shared_ptr<Base> get(string name);
shared_ptr<File> addFile(const string& name, uintmax_t size);
shared_ptr<Directory> getDir(const string& name);
shared_ptr<File> getFile(const string& name);
bool remove(const string& name);
int mType() const override;
~Directory();
private:
const int TYPE = 0;
Directory();
};
DIRECTORY. CPP
#include "Directory.h"
#include <iostream>
using namespace std;
Directory::Directory(){
cout << "Creating directory" << endl;
};
shared_ptr<Directory> Directory::makeDirectory(std::string name, std::weak_ptr<Directory> parent) {
shared_ptr<Directory> d = shared_ptr<Directory>(new Directory());
cout<< d.use_count() << endl;
d->name = name;
d->parent = parent;
d->self = d;
return d;
}
shared_ptr<Directory> Directory::addDirectory(string name){
cout << this << endl;
auto e = shared_from_this();
auto d = Directory::makeDirectory(name, shared_from_this());
auto s = shared_ptr<Directory>(Directory::makeDirectory(name, shared_from_this()));
this->children.push_back(static_pointer_cast<Base>(s));
return s;
}
shared_ptr<Directory> Directory::getRoot(){
if(root.get() == nullptr){
root = Directory::makeDirectory("/", std::weak_ptr<Directory>());
cout << root.get() << endl;
}
return root;
}
void Directory::ls(int indent) const{
int SPACES = 4;
for(int i=0; i<children.size(); i++){
for(int j=0; j<indent; j++) cout << " ";
cout << children[i]->name << endl;
children[i]->ls(indent+SPACES);
}
}
shared_ptr<Base> Directory::get(string name){
if(name == "..") return parent.lock();
if(name == ".") return self.lock();
vector<shared_ptr<Base>>::iterator it = std::find_if(children.begin(), children.end(), [name](const shared_ptr<Base>& val){
if(val->name == name) return true;
return false;
});
if(it!= children.end()){
return *it;
}
return shared_ptr<Directory>();
}
Directory::~Directory(){
cout << "Destroying direcory " << this << endl;
}
shared_ptr<File> Directory::addFile(const string& name, uintmax_t size){
auto file = make_shared<File>(name, size);
this->children.push_back(file);
return file;
}
int Directory::mType() const {
return TYPE;
}
BASE.H
class Base{
public:
std::string name;
std::string getName() const {
return name;
}
virtual int mType() const = 0;
virtual void ls(int indent) const = 0;
};
MAIN. CPP
auto Directory::root = shared_ptr<Directory>();
int main() {
shared_ptr<Directory> d = Directory::getRoot();
std::cout << d.get() << std::endl;
d->addDirectory("bin");
return 0;
}
Из d.get () у меня есть 2 shared_ptr, которые указывают на каталог root (один находится в основном, а другой - в этом-> self) но я все равно получаю сообщение об ошибке.