Мне сложно понять, почему, когда я печатаю дерево разными способами, я получаю разные числа use_counts () для моих общих указателей.
Используя приведенный ниже код, когда я вызываю метод "one-> Print () ", я, кажется, неправильно получаю 2 ссылки для непосредственного потомка одного, но при использовании" one-> Print (one) "я получаю правильное количество ссылок, которое равно 1.
Как я могу изменить свой код, чтобы "one-> Print ()" возвращал правильное количество ссылок для всех узлов в дереве?
#include <iostream>
#include <memory>
template<class T> using sp = std::shared_ptr<T>;
struct Node {
int value;
sp<Node> child;
Node(int value): value {value} {}
inline void Print() const {
Print(std::make_shared<Node>(*this));
}
inline void Print(const sp<Node>& ptr) const {
Print(ptr, "", false);
}
void Print(const sp<Node>& ptr, const std::string& prepend, bool isEnd) const {
if(ptr != nullptr) {
std::cout << prepend << (isEnd ? "└────" : "├────");
std::cout << " " << ptr->value << " (" << ptr.use_count() << ")" << std::endl;
} else {
std::cout << " " << ptr->value << std::endl;
}
if(ptr->child != nullptr) {
Print(ptr->child, prepend + (isEnd ? " " : "│ "), false);
}
}
};
int main(int argc, char * argv[])
{
sp<Node> one = std::make_shared<Node>(1);
one->child = std::make_shared<Node>(2);
one->child->child = std::make_shared<Node>(3);
one->child->child->child = std::make_shared<Node>(4);
one->child->child->child = std::make_shared<Node>(5);
one->Print();
one->Print(one);
return 0;
}
Вывод выглядит так:
one-> Print ();
├──── 1 (1)
│ └──── 2 (2)
│ └──── 3 (1)
│ └──── 5 (1)
one-> Print (один);
├──── 1 (1)
│ └──── 2 (1)
│ └──── 3 (1)
│ └──── 5 (1)