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