strumienie - coś nie działa.

0

Uwagi:
is jest strumieniem liczb od 0-10.

Jak piszę tak:

	IntStream is(10);
	cout << "IntStream(10):" << endl;
	cout << is << endl
		<< "is.next(): " << is.next() << endl;

To wypisuje objekty w odpowiedniej kolejności, ale niestety indeks w strumieniu jest zwiększany o jeden. Czyli tak jakby is.next() się wykonywało, przed wypisywaniem objektu "is", ale nie wypisywało się przed wypisaniem objektu "is".

Jak piszę tak:

	IntStream is(10);
	cout << "IntStream(10):" << endl;
	cout << is << endl;
	cout << "is.next(): " << is.next() << endl;
// wywołuję cout jeszcze raz.

To wtedy działa dobrze.

Nie wiem czemu pierwszy zapis nie tak dziwnie działa.

0

Bez klasy IntStream a zwłaszcza jej operatora << trudno będzie odpowiedzieć.

0

class IntStream {
protected:
int max;
int* stream;
int idx;

public:
IntStream() {
IntStream(10);
}

IntStream(int max) {
	idx = 0;
	this->max = max+1;
	stream = new int[this->max];

	for (int i = 0; i < max+1; ++i) {
		stream[i] = i;
	}
}

int next() {
	return stream[idx++];
}

bool eos() {
	if (idx > max)
		return true;
	else
		return false;
}

void reset() {
	idx = 0;
}

friend ostream& operator<<(ostream& s, IntStream& is);

};

ostream& operator<<(ostream& s, IntStream& is) {
while (is.idx < is.max) {
s << is.next() << " ";
}

	return s;

}

0

I jeszcze jedno pytanie. Co zrobić, gdy chcę mieć dostęp do prywatnych składowych klasy bazowej w funkcji zaprzyjaźnionej z klasą rozszerzoną?
Zadeklarowałem w klasie bazowej te składowe jako protected, ale zaprzyjaźnienie daje mi tylko dostęp do składowych klasy rozszerzonej.

Dobra, to ostatnie pytanie jest nieaktualne.

0

jeżeli piszesz wyrazenie
x=ab+cd;
to na pewno wykona ci to tak: (ab)+(cd) ale nie koniecznie najpierw obliczy ab a potem cd może to wykonać naodwrót
tmp2=(cd);
tmp1=(a
b);
x=tm1+tmp2;
Jak chcesz wymusić kolejność to zapisz:
x=(ab)+cd;
Oraz nie zapomnij wyłączyć optymalizacje bo optymalizator może zignorować te "zbędne" nawiasy okrągłe.
Podsumowując w twoim przypadku, albo pisz rozdzielnie, albo bez optymalizatora:
(cout<<is<<" ")<<is.next()<<endl;

0

widzę tu problem projektowy: operator <<, służący do pobierania (np. wyświetlania) zawartości zmiennej, nie powinien jej modyfikować (powinien być const), a tu modyfikuje poprzez .next().

0

Dzięki chłopaki za zainteresowanie i za poprawną odpowiedź, nie przyszłoby mi do głowy, że taki jest tego powód i dalej bym się nad tym głowił. Nie mam pojęcia, po co tak dziwnie zrobili, że się nie wykonuje po kolei.

Tak, powinno być const, ale idea pisania tego kodu była następująca: "oby działał", aczkolwiek słuszna uwaga.

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