Przeciążanie operatora <<

0

Witam nie do końca rozumiem jak działa taki kod:

 std::ostream & operator<<(std::ostream & stream, BstNode * bst)
{
    if (bst) {
        stream << bst->left.get() << bst->value << " " << bst->right.get();
    }
    return stream;
}
 struct BstNode
{
    int value;
    std::unique_ptr<BstNode>left;
    std::unique_ptr<BstNode>right;

    BstNode(int value);
};

Mógłby mi go ktoś wyjaśnić?

1

Operator przekazuje do strumienia wyjściowego wartości wskaźnika przechowywane w lewym i prawym liściu węzła BstNode * bst, oddzielone spacją.

1

Funkcja get zwraca wskaźnik: http://www.cplusplus.com/reference/memory/unique_ptr/get/
Patrz też na przykład. Są tam adresy obiektów:

http://ideone.com/y7yGDk

0
 #include <memory>
#include <iostream>
#include <string>

struct BstNode
{
    int value;
    std::unique_ptr<BstNode>left;
    std::unique_ptr<BstNode>right;
    BstNode(int value);
};

void addToTree(std::unique_ptr<BstNode>& bst, int value)
{
    if (bst) {
        if (value < bst->value) {
            addToTree(bst->left, value);
        }
        else if (value > bst->value) {
            addToTree(bst->right, value);
        }
    }
    else{
        bst = std::make_unique<BstNode>(value);
    }
}

std::unique_ptr<BstNode>& operator << (std::unique_ptr<BstNode>& bst, int value)
{
    addToTree(bst, value);
    return bst;
}

BstNode::BstNode(int value) : value(value), left(nullptr), right(nullptr) {};

std::unique_ptr<BstNode>createBstNode(int value)
{
    std::unique_ptr<BstNode> node = std::make_unique<BstNode>(8);
    return move(node);
}

std::ostream & operator<<(std::ostream & stream, BstNode * bst)
{
    if (bst) {
        stream << bst->left.get() << bst->value << " " << bst->right.get();
    }
    return stream;
}

int main()
{
    std::unique_ptr<BstNode> bst = nullptr;
    addToTree(bst, 5);
    std::cout << bst.get() << std::endl;
    addToTree(bst, 2);
    std::cout << bst.get() << std::endl;
    addToTree(bst, 8);
    std::cout << bst.get() << std::endl;
    return 0;
}

to jest cały kod może coś innego w nim powoduję zmianę Twoich i moich przewidywań...

1

Już wszystko jasne. Przeładowałeś operator << więc funkcja get zwraca wskaźnik do węzła, z którego odczytujesz wartości tutaj: cout << bst.get().
To samo robisz również tutaj: stream << bst->left.get() i dlatego pokazywana jest wartość value, a nie adresy wskaźników, bo przecież left również jest typu unique_ptr<BstNode>.

IMHO przeładowanie tego operatora zaciemnia trochę to co tutaj się dzieje.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0