Я получаю ошибку Bad weak ptr с share_from_this - PullRequest
0 голосов
/ 16 июня 2020

Я пытаюсь использовать 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) но я все равно получаю сообщение об ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...