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

manipulator dwuargumentowy

Object Storage Arubacloud
0 głosów
383 wizyt
pytanie zadane 14 grudnia 2018 w C i C++ przez karwyt Nowicjusz (140 p.)

Zrobiłem program który odczytuje dane z pliku i zapisuje je do kontenera i zlicza ilość.

Problem pojawia się przy "color"

zrobiłem strukturę

struct color										
{
	unsigned char red;
	unsigned char green;
	unsigned char blue;
};

wczytuje plik o rozszerzeniu ppm w którym każdy piksel składa się z 3 kolorów rgb.

w szablonie robię klasę która posiada metodę do wczytywania danych z pliku do kontenera map

 

std::fstream plik(sciezkapliku, std::ios::in);

	while (plik >> tekst)
	{
		kontener[tekst]++;
	}

gdzie zmienna tekst w tym przypadku ma typ color, a mapa w tym przypadku ma wartości map<color,int>kontener.

 

Żeby program działał muszę zrobić operator >> dla color

	friend std::fstream& operator>>(std::fstream &plik,const color &s)
	{
			plik >> s.red >> s.green >> s.blue;
		return plik;
	}

zrobiłem takie przeciążenie operatora>> ale przy próbie włączenia programu wywala błąd o braku odpowiedniego operatora>> dla tego typu.

Gdzie jest błąd ?

1 odpowiedź

0 głosów
odpowiedź 14 grudnia 2018 przez adrian17 Ekspert (344,860 p.)
friend std::fstream& operator>>(std::fstream &plik,const color &s)

`s` jest oznaczony `const`, ale dwie linie niżej próbujesz go modyfikować.

komentarz 14 grudnia 2018 przez karwyt Nowicjusz (140 p.)
tak to jest błąd, ale jest on przez to, że szukałem błędu i wpisałem const i zapomniałem go usunąć. Ale to nie o to chodzi o dalej wywala błąd, że nie odnajduje operatora

 Stan pominięcia Błąd    C2679    dwuargumentowy ">>": nie znaleziono żadnego operatora, który przyjmuje prawostronny operand typu "T" (lub nie istnieje akceptowalna konwersja)  

 

Gdzie T to color
komentarz 14 grudnia 2018 przez adrian17 Ekspert (344,860 p.)
Pokaż nowy kod po tym, jak usunąłeś const. W całości.
komentarz 14 grudnia 2018 przez karwyt Nowicjusz (140 p.)
Doszedłem już do tego dlaczego nie łapało tego operatora. Po prostu zamiast w strukturze dałem operator w klasie.

Ale teraz inne pytanie bo wymagany jest operator<

jak powinien wyglądać ten operator

 

 Stan pominięcia Błąd    C2678    dwuargumentowy "<": nie znaleziono żadnego operatora, który przyjmuje lewostronny operand typu "const _Ty"
komentarz 14 grudnia 2018 przez adrian17 Ekspert (344,860 p.)
Nic mi to nie mówi bez kodu.
komentarz 14 grudnia 2018 przez karwyt Nowicjusz (140 p.)
edycja 14 grudnia 2018 przez karwyt

masz wszystko wyżej

struktura

struct color																	
{
	unsigned char red;
	unsigned char green;
	unsigned char blue;



	friend std::fstream& operator>>(std::fstream &plik, color &s)
	{
	

		plik >> s.red >> s.green >> s.blue;
		return plik;
	}

};

template

template <typename T>
class freqcounter
{
private:

	std::map < T, int > kontener;
	T tekst;

public:
	
	

	inline void add(std::string sciezkapliku)
	{
		
		std::fstream plik(sciezkapliku, std::ios::in);


		while (plik >> tekst)
		{
			kontener[tekst]++;
		}



		plik.close();
	}

	};

 

komentarz 14 grudnia 2018 przez adrian17 Ekspert (344,860 p.)

Ah.

Ale teraz inne pytanie bo wymagany jest operator<
jak powinien wyglądać ten operator

Żeby użyć std::map, przechowywany obiekt musi być porównywalny.

Czyli chodzi o

struct color  {
    bool operator<(const color& other) const {
        // ...
    }
}

W środku porównujesz r,g,b jednego koloru z drugim.

komentarz 15 grudnia 2018 przez mokrowski Mędrzec (155,460 p.)

@karwyt,

Nasuwają mi się takie pytania:

1. Jeśli struktura color jest typowym VO (ang. Value Object), czyli surowym kontenerem na dane które są dostępne publicznie, w jakim celu robisz friend? Ogólnie friend należy unikać bo niszczy hermetyzację która nie jest tu potrzebna (zakładam że na potrzebę ćwiczenia publiczny dostęp do elementów color jest ok).

2. Nazwa freqcounter, sugeruje że będziesz chciał zliczać ilość wystąpień kolorów. Skąd więc pomysł na rozmycie odpowiedzialności tej klasy na obsługę plików? Nawet jeśli przyjmiesz że to będzie ok, nazwę metody add(..) raczej zmień na readFile(...), inputFromFile(...) czy jakąś podobną.

3. Kontener std::map, pozwoli Ci wyłącznie na szybkie odszukanie danych po kluczu ale już nie zezwoli na posortowanie ich względem ilości wystąpień. To taka uwaga abyś "nie szukał nadaremno". Inną rzeczą jest pytanie czy rzeczywiście niezbędne jest posortowanie wg. klucza? Co to Ci da (oprócz szybkiego wyszukania)? Szybkie wyszukanie osiągniesz także przez std::unordered_map które nie sortuje przy każdym wstawieniu.

Podobne pytania

0 głosów
1 odpowiedź 97 wizyt
pytanie zadane 15 listopada 2020 w C i C++ przez rolniczy Nowicjusz (210 p.)
0 głosów
1 odpowiedź 368 wizyt
0 głosów
0 odpowiedzi 329 wizyt
pytanie zadane 30 listopada 2018 w C i C++ przez Tomasz Sobczak Bywalec (2,830 p.)

92,555 zapytań

141,403 odpowiedzi

319,554 komentarzy

61,939 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...