Article View: pl.comp.lang.delphi
Article #334854Re: [outro] ]Re: Delphi do zastosowan domowych
From: Arivald
Date: Fri, 20 Jan 2012 08:04
Date: Fri, 20 Jan 2012 08:04
125 lines
5940 bytes
5940 bytes
W dniu 2012-01-19 20:24, Wojciech "Spook" Sura pisze:
> Dnia 19.01.2012 o 18:56 R.e.m.e.K <go@dev.null> napisał(a):
>>> {
>>> std::vector<std::string > & SL = GetStringListWithContent();
>>>
>>> auto result = [&SL]() -> std::string
>>> {
>>> std::string tmp;
>>> for (int i = 0; i < SL.size(); i++)
>>> tmp += (SL[i] + "\n");
>>> return tmp;
>>> }();
>>> }
>>
>> No dobra, ruki wierch, poddaje sie, nie znam C++ i troche pojechalem po
>> bandzie, ale chcialem pokazac co mozna zrobic w Delphi i to mnie
>> czesciowo tlumaczy :-)
>> ps. to jest tez funkcja anonimowa?
>
> Już chciałem Pana pocieszyć, że to składnia nowego C++11 i że jeszcze
> jej kompilatory nie obsługują, ale przed chwilą wklepałem powyższy kod z
> niewielkimi poprawkami do VS2010EE i wstał (!).
>
> A jeżeli pętla się Panu nie podoba, to można [będzie] też tak:
>
> (...)
>
> for (std::string & s : SL)
> tmp += (s + "\n");
>
> ...ale żeby skompilować taki kod trzeba niestety jeszcze trochę poczekać
> albo użyć GCC, który ma już zaimplementowane 90% standardu (
> https://wiki.apache.org/stdcxx/C%2B%2B0xCompilerSupport )
>
Ładnie się C++ rozwija ;-)
> Ale mogę ripostować za Pana - w C++ nie ma na przykład atrybutów i nie
> zanosi się na to, by się szybko pojawiły,
Wbudowanych nie ma, ale można sobie podobną funkcjonalność samemu
napisać. Oczywiście wsparcie kompilatora dla atrybutów jest nie do
przecenienia.
> Do licha, ale wysoko wycelowałem. W C++ nie ma nawet własności, trzeba
> poprzestać na getterach i setterach. Można co najwyżej zrobić przekręt i
> zdefiniować podklasę żeby umożliwić zapis instancja.wlasnosc[4] = 3;
Tu podobnie. I nie nazwał bym tego przekrętem. W C++ tworzenie klasy
jest bardzo tanie, znacznie tańsze niż w Delphi. Dodatkowo można
przeładować operatory, tak że koniec końców używanie takiej "property"
nie będzie się niczym różniło od jej użycia w Delphi.
A kompilacja template w momencie tworzenia instancji daje możliwość
utworzenia jednego, prostego template klasy "property", i potem
kompilator sam będzie generował instancje dla różnych typów.
A jak dodasz do tego mechanizm trejtów (traits), z odpowiednią
konkretyzacją dla np. callbacków, to daje się łatwo zaimplementować
bardzo skomplikowane działania.
> Z drugiej strony w Delphi bardzo brakuje C++owego consta. W C++ const
> nie jest formalnie deklaratorem stałej, tylko modyfikatorem. Na przykład:
>
> int * i; // Wskaźnik do inta;
> const int * i; // Wskaźnik do stałego inta. Wskaźnik można
> przedefiniować, ale wartości wskazywanej przez niego - nie
> int const * i; // Stały wskaźnik do inta. Wskaźnika nie można
> przedefiniować, ale wartość przez niego wskazywaną - tak
> const int const * i; // Stały wskaźnik do stałego inta.
>
> Ciekawie są też skonstruowane metody z constem. Metoda const zobowiązuje
> się do niemodyfikowania zawartości klasy, na przykład:
Hmmm... Ja o takich metodach myślę nieco innaczej. Metoda const to taka
metoda którą można wywołać na rzecz obiektu który jest const. Bo w
szczególnych wypadkach ona może jednak zmienić pola klasy.
>
> Jako ciekawostkę podam, że do C++ przeraźliwie zniechęcała mnie na
> początku konstrukcja:
>
> std::cout << zmienna << "\n";
>
> Bo co za przyzwoity, współczesny język przekazuje parametry tak, jak
> przekierowywane są strumienie w plikach wsadowych? I dopiero na jakimś
> mądrym FAQ znalazłem wyjaśnienie zagadki:
>
> class cout
> {
> public:
> cout & operator << (int i)
> {
> // Do something
> return *this;
> }
> }
Co w tym mądrego? Bo nie widzę.
To że strumień ma operatory << i >> dla większości wbudowanych typ to
konieczność.
Zwracanie referencji na siebie, umożliwiające wywołanie łańcuchowe, to
też nie jest żadne cudo... W Delphi też tak można.
Istotniejszy jest fakt że w każdej klasie możesz przeładować operatory
<< i >> w kontekście strumienia, dzięki czemu klasa sama będzie
wiedziała jak się zapisać i jak się wczytać z dowolnego strumienia.
> Niewyjaśnione pozostaje dla mnie natomiast, dlaczego początkującym
> C++owcom w każdej pojedynczej książce w pierwszym programie hello world
> serwuje się statycznie alokowaną klasę (na stosie) z przeciążonym
> operatorem i wywołaniem łańcuchowym. Ale tego pewnie się nigdy nie
> dowiem...
Bo strumienie standardowe to podstawowa metoda interakcji z
użytkownikiem? A tego przeciążenia i łańcucha nie widać, tego się nauczy
później.
--
Arivald
Technical Details
Message-ID:
<jfb799$qli$1@news.dialog.net.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!news.dialog.net.pl!not-for-mailReferences:
<1nva6kty8t73b$.dlg@hell.heaven> <jf99kg$t6e$1@news.dialog.net.pl> <162t4ulo0stz4.dlg@hell.heaven> <op.v8cee3coyumhbd@notebook.asus> <1i4rse32tw0m7.dlg@hell.heaven> <op.v8ciulumyumhbd@notebook.asus>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!news.dialog.net.pl!not-for-mail From: Arivald <NOSPAMarivald@interia.pl> Newsgroups: pl.comp.lang.delphi Subject: Re: [outro] ]Re: Delphi do zastosowan domowych Date: Fri, 20 Jan 2012 09:04:23 +0100 Organization: Dialog Net Lines: 125 Message-ID: <jfb799$qli$1@news.dialog.net.pl> References: <1nva6kty8t73b$.dlg@hell.heaven> <jf99kg$t6e$1@news.dialog.net.pl> <162t4ulo0stz4.dlg@hell.heaven> <op.v8cee3coyumhbd@notebook.asus> <1i4rse32tw0m7.dlg@hell.heaven> <op.v8ciulumyumhbd@notebook.asus> NNTP-Posting-Host: dynamic-78-8-242-109.ssp.dialog.net.pl Mime-Version: 1.0 X-Trace: news.dialog.net.pl 1327046761 27314 78.8.242.109 (20 Jan 2012 08:06:01 GMT) X-Complaints-To: abuse@dialog.net.pl NNTP-Posting-Date: Fri, 20 Jan 2012 08:06:01 +0000 (UTC) User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0) Gecko/20120111 Thunderbird/10.0 In-Reply-To: <op.v8ciulumyumhbd@notebook.asus> X-Antivirus: avast! (VPS 120119-2, 2012-01-19), Outbound message X-Antivirus-Status: Clean Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit