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

Przeciążanie operatorów WinApi

Object Storage Arubacloud
0 głosów
181 wizyt
pytanie zadane 27 stycznia 2017 w C i C++ przez niezalogowany
edycja 27 stycznia 2017
Przeciążyłem operator << tak, że jeśli po jego lewej stronie stoi argument typu HWND, a po prawej string to do istniejącego tekstu jest dopisywany ten string. Stworzyłem zatem okienkowy odpowiednik cout żeby ułatwić sobie pracę. Mam w związku z tym kilka pytań

1. W Symfonii C++ jest napisane, że nie można przeciążać operatora dla samych typów wbudowanych, co najmniej jeden argument funkcji operatorowej musi być typu zdefiniowanego przez programistę (BTW czy może to być np. struktura, a nie klasa?). Mój program działa, bo string nie jest typem wbudowanym, ale co gdybym użył zamiast stringa np. int? Wiem, że mógłbym sam sprawdzić, ale chwilowo nie mam dostępu do komputera z projektami i kompilatorem, a bardzo mnie to ciekawi. Czy zmienne z biblioteki WinApi są typami wbudowanymi?

2. Przeciążać nie można podobno dla typów wbudowanych bo definicje takich funkcji operatorowych podobno gdzieś już są (Symfonia wydanie 3 str 712). Ale w przypisie jest napisane, że trochę to tłumaczenie naciągane. O co w tym chodzi? Co gdybym przeładował np. operator * , a funkcja przyjmowała by np. floata i chara? Są wbudowane, ale chyba nie istnieje taka funkcji operatorowa, więc zadziałałoby czy nie i dlaczego? Chcę się trochę więcej dowiedzieć, zanim zacznę pisać własną bibliotekę "winoperators.h".

2 odpowiedzi

0 głosów
odpowiedź 27 stycznia 2017 przez koczurekk Gaduła (3,420 p.)
edycja 27 stycznia 2017 przez koczurekk
1. Tak, HWND jest typem wbudowanym, nie zdefiniowano go w WinAPI. To tak naprawdę to samo co void*, więc przeładowanie tak jakiegoś operatora jest okropnym pomysłem, poza tym coś takiego jak ptr<<"znak" nie ma sensu. Ale ogólnie w WinAPI jest dużo nowych typów (tj. struktur), którym możesz przeładować operatory chociaż nie jest to zalecane – co jeśli M$ kiedyś postanowi sam to zrobić (oczywiście nie zrobi, dlatego nazwałem to jedynie „niezalecanym”)? Ogólnie operator powinieneś przeładować kiedy chociaż jeden argument jest TWÓJ.

2. Istnieje operator* z parametrami float i char, nazywa się mnożenie. Pamiętaj, że char jest typem liczbowym i w przypadku 2.f * '0' dostałbyś to samo co 2.f * 48 →96.

//edit: Ps. możesz podzielić się swoją implementacją tego operatora, bo prawie na pewno jest źle i będę mógł napisać dlaczego.
0 głosów
odpowiedź 27 stycznia 2017 przez niezalogowany

Implementacja

operator << (HWND hwnd, string tekst)
{
	LPTSTR stary;
	DWORD rozmiar = GetWindowTextLength(hwnd);

	stary =( LPSTR ) GlobalAlloc( GPTR, rozmiar + 1 ); //dynamiczna alokacja pamięci

	GetWindowText(hwnd, stary, rozmiar);
	stary[ rozmiar ] = 0; // dodaj zero na końcu stringa

	string nowy = stary;
	nowy += tekst;

	SetWindowText(hwnd, nowy.c_str());
}

Z jakiegoś powodu ucina ostatni znak(zamiast dopisywać do tekstu nowy to działa jak replace ostatniego znaku).

Podobne pytania

0 głosów
1 odpowiedź 211 wizyt
0 głosów
1 odpowiedź 461 wizyt
+1 głos
0 odpowiedzi 358 wizyt

92,573 zapytań

141,423 odpowiedzi

319,648 komentarzy

61,959 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!

...