У меня проблема с shared_ptr и указателем 'this'.Я нашел решение использовать enable_shared_from_this, но:
std::shared_ptr<Binary_search_tree> x = shared_from_this();
выдает исключение.Как правильно использовать его в моем случае?
вот код с контекстом:
#pragma once
#include <memory>
#include <string>
bool def_comparator(int x, int y) {
if (x>y)
{
return true;
}
else {
return false;
}
};
template <typename T>
class Binary_search_tree : public std::enable_shared_from_this<Binary_search_tree<T>>
{
public:
std::shared_ptr<Binary_search_tree> up;
std::shared_ptr<Binary_search_tree> left;
std::shared_ptr<Binary_search_tree> right;
int key;
T data;
bool(*comparator)(int, int);
Binary_search_tree(T x, const int key, bool(*comparator)(int, int))
{
if (comparator==NULL)
{
this->comparator = &def_comparator;
}
else {
this->comparator = comparator;
}
this->data = x;
this->key = key;
}
Binary_search_tree()
{
}
~Binary_search_tree()
{
}
bool insert(T data, const int key)
{
std::shared_ptr<Binary_search_tree> y;
std::shared_ptr<Binary_search_tree> x = shared_from_this();
if (comparator(key, x->key))
{
x = x->left;
}
else {
x = x->right;
}
while (x != NULL)
{
y = x;
if (comparator(key,x->key))
{
x = x->left;
}
else {
x = x->right;
}
}
Binary_search_tree<T> *tmp = new Binary_search_tree<T>(data, key, this->comparator);
tmp->up = y;
if (tmp->key == y->key)
{
return false;
}
if (comparator(tmp->key,y->key))
{
y->left = shared_ptr<Binary_search_tree<T>>(tmp);
}
else {
y->right = shared_ptr<Binary_search_tree<T>>(tmp);
}
return true;
}
}
РЕДАКТИРОВАТЬ: я добавил всего insert
код метода @Tyker я надеваюне пытайтесь получить доступ к членам таким образом, мне нужно пройтись по моему дереву, чтобы добавить новый элемент, используя указатели x
и y
.Если «следующий элемент» отсутствует, указатель остается без изменений, а затем добавляется новый элемент.@GM ты имеешь в виду что-то вроде этого:
std::shared_ptr<Binary_search_tree<T>> x(new Binary_search_tree<T>);
x = shared_from_this();