• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Problem z przeciążaniem operatora '!=' dla różnych klas

VPS Starter Arubacloud
0 głosów
489 wizyt
pytanie zadane 19 września 2019 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)
zamknięte 19 września 2019 przez Jakub 0

Hej, jakiś czas nie pisałem w C++ i już musiałem coś zapomnieć bo nie potrafię sobie poradzić z pewnym problemem. Oto mój kod:

*.h

#ifndef RANGE_H_
#define RANGE_H_

class Range {
public:

	class iterator {
		friend class usiterator; 
	private:
		const int m_Steep; 
		int m_actual; 

	public:
		iterator(const int& limit, const int& steep);
		bool operator!=(const iterator& other) const; 
		bool operator!=(const usiterator& other) const; //ERROR1
		const int& operator*() const; 
		const iterator& operator++();
		const iterator& operator++(int);  
	};

	class usiterator {
		friend class iterator;
	private:
		const int m_Value;

	public:
		usiterator(const int& actual);
		bool operator!=(const usiterator& other) const;
		bool operator!=(const iterator& other) const; //ERROR2
		const int& operator*() const;
	};

private:
	const int m_From;
	const int m_To;
	const int m_Step;

public:
	Range(const int& from=0, const int& to=0, const int& step=0);
	iterator begin() const; 
	iterator end() const;
};

#endif

*.cpp

#include "Range.h"

Range::Range(const int& from, const int& to, const int& step) 
	: m_From(from), m_To(to), m_Step(step) {}

///----------------------------------------------------------------

Range::iterator Range::begin() const {
	return iterator(m_From, m_Step);
}

///----------------------------------------------------------------

Range::iterator Range::end() const {
	return iterator(m_To, m_Step);
}

///----------------------------------------------------------------

Range::iterator::iterator(const int& limit, const int& steep) 
	: m_actual(limit), m_Steep(steep) {
}

///----------------------------------------------------------------

bool Range::iterator::operator!=(const iterator& other) const {
	if (m_Steep < 0) {
		if (m_actual <= other.m_actual)
			return false;
		return true; 
	}
	else {
		if (m_actual >= other.m_actual)
			return false;
		return true;
	}
}

///---------------------------------------------------------------- ERROR1:

bool Range::iterator::operator!=(const Range::usiterator& other) const {
	return m_actual != other.m_Value;
}

///----------------------------------------------------------------

const int& Range::iterator::operator*() const {
	return m_actual; 
}

///----------------------------------------------------------------

const Range::iterator& Range::iterator::operator++() {
	int temp = m_actual; 
	m_actual += m_Steep;
	return iterator(temp, m_Steep);
}

///----------------------------------------------------------------

const Range::iterator& Range::iterator::operator++(int) {
	m_actual += m_Steep;
	return *this; 
}

///----------------------------------------------------------------

Range::usiterator::usiterator(const int& actual) 
	: m_Value(actual) {}

///----------------------------------------------------------------

bool Range::usiterator::operator!=(const usiterator& other) const {
	return m_Value != other.m_Value;
}

///---------------------------------------------------------------- ERROR2:

bool Range::usiterator::operator!=(const Range::iterator& other) const {
	return m_Value != other.m_actual; 
}

///----------------------------------------------------------------

const int& Range::usiterator::operator*() const {
	return m_Value;
}



Myślę że to co projektuje nie ma to zbyt dużego znaczenia, problem jest z metodami oznaczonymi jako ERROR1 i ERROR2. Dostaję takie komunikaty kompilatora dla:

ERROR1:

Błąd (aktywny)    E0493    żadne wystąpienie elementu funkcja przeciążona "Range::iterator::operator!=" nie jest zgodne z określonym typem
Błąd    C2511    "bool Range::iterator::operator !=(const Range::usiterator &) const": przeciążona funkcja członkowska nie została znaleziona w "Range::iterator"  

ERROR2:

Błąd    C2248    "Range::iterator::m_actual": nie można uzyskać dostępu do private element członkowski zadeklarowanych w klasie "Range::iterator"   

Nie wiem z czego one wynikają, przecież klasy są ze sobą zaprzyjaźnione a ciała metod są w osobnym pliku ( wobec tego nie powinno być problemów  w stylu: "kompilator nie zna ciała klasy" ) .

Z góry dziękuje za pomoc i pozdrawiam :)

komentarz zamknięcia: problem rozwiązany

2 odpowiedzi

+1 głos
odpowiedź 19 września 2019 przez Michałełe Nałogowiec (25,600 p.)
wybrane 19 września 2019 przez Jakub 0
 
Najlepsza

Witam

Cały problem polega na tym, że przy deklaracji

//.....
	class iterator {
		friend class usiterator;
	private:
		const int m_Steep;
		int m_actual;
//.....

Jeszcze nie istnieje klasa usiterator. Przynajmniej nie dla kompilatora. Dlatego wystarczy ponad iterator dopisać

class usiterator;

class iterator {
//
//

"Mówimy" wtedy, że taka klasa istnieje, i zostanie ona napisana niżej.

komentarz 19 września 2019 przez tkz Nałogowiec (42,000 p.)
Napisałem dokładnie to samo XD
komentarz 19 września 2019 przez Jakub 0 Pasjonat (23,120 p.)

To się teraz nieźle zaskoczyłem, kiedyś gdzieś przeczytałem że zapis:

friend class klasa

określa przyjaźń i automatycznie jest pre-deklaracją danej klasy ( czyli nie musimy wcześniej pisać class klasa bo ta instrukcja z góry zakłada że klasa taka istnieje ). Ale cóż... widocznie coś mi się pomyliło. Dzięki za pomoc.

komentarz 19 września 2019 przez Jakub 0 Pasjonat (23,120 p.)

@tkz,
Ale obu osobom niestety nie mogę dać Naj, musiałem wybrać. Chyba się nie gniewasz ;)

komentarz 19 września 2019 przez Michałełe Nałogowiec (25,600 p.)
@tkz

Nie widziałem, jak pisałem to jeszcze nie było nic, ale leci upvote dla ciebie :)
komentarz 19 września 2019 przez tkz Nałogowiec (42,000 p.)
Luzik, płakać nie będę. Masz kod, więc to na plus w porównaniu do mojej.
+2 głosów
odpowiedź 19 września 2019 przez tkz Nałogowiec (42,000 p.)
Używasz usiterator zanim go zadeklarujesz. class usiterator;  zadeklaruj przed iterator.

Podobne pytania

0 głosów
2 odpowiedzi 181 wizyt
0 głosów
1 odpowiedź 310 wizyt
pytanie zadane 25 kwietnia 2022 w C i C++ przez Mavimix Dyskutant (8,390 p.)
+1 głos
1 odpowiedź 326 wizyt

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...