2009-10-24 7 views
12

Chociaż lubię programowania w języku C++, nienawidzę idei:
std::basic_stringvsQStringvswxStringvs .............
Nie klasa standard string zaspokaja potrzeby tych ram? Mam na myśli co jest nie tak z klasą standard string ?!Dlaczego w każdej platformie C++ jest inna klasa napisów?

Wystarczy podkreślić, że poniżej jest ważne pytanie:
Czy uczysz „” klasy ciąg ramach w każdym ramach idziesz do pracy? czy zamiast tego trzymasz się standardowej klasy ciągów, próbując dostosować ją wszędzie?

Dzięki ...

+7

Niestety , ale uwielbiam C++. Jest to język, którego używam i wolę pracować z wieloma językami. Przeczytaj uważnie to pytanie. – AraK

+2

"Standardy są świetne, musimy zdefiniować własne!" ;) – Macke

+1

"Miłą cechą standardów jest to, że jest ich tak dużo do wyboru." * Andrew S. Tanenbaum *, http://www.iwise.com/y2rQb – DigitalRoss

Odpowiedz

14

Powodem wielu klas napisów jest to, że standard C++ został sfinalizowany dość późno (w 1998 r.); następnie zajęło trochę czasu, zanim wszystkie systemy faktycznie dostarczyły poprawną bibliotekę C++. Do tego czasu wszystkie konkurencyjne klasy ciągów zostały już napisane.

Ponadto, w niektórych przypadkach ludzie chcą dziedziczyć po jednej klasie bazowej, której nie mógłby wykonać ciąg std :: string.

+0

Myślę, że odpowiedziałeś pośrednio na drugi punkt ... Po prostu zostaw to na czas, a standardowy ciąg będzie praktycznie standardowy. – AraK

+0

Problem polega na tym, że wykonali tak marną robotę. Po 10 latach rozmyślania masz klasę ciągów, która powtarza niektóre, ale nie wszystkie std :: algorytmy, nie robi unicode, nie robi kopiowania przy zapisie i nawet nie ładnie gra z innymi standardowymi funkcjami lib, które wciąż potrzebujesz znaku *. –

+2

Kopiowanie przy zapisie jest droższe/niebezpieczne w systemach wieloprocesorowych niż w przypadku kopii zawsze. Jeden rozmiar nie pasuje do wszystkich, szczególnie gdy ten jeden rozmiar jest wszystkim, łącznie z zlewem kuchennym. – jmucchiello

5

jeden rozsądny powód (w porównaniu z nieuzasadnionych powodów, takich jak „Nie chcę, aby dowiedzieć się Bibliotekę Standardowy”) jest to, że niektóre biblioteki chcą zachować kontrolę nad układem binarnym, w celu osiągnięcia niektóre rodzaje interoperacyjności (takie jak kompatybilność binarna w różnych wersjach). Przykładem tego jest _bstr_t w bibliotekach VC++; dla celów COM ważne jest to, że _bstr_t jest reprezentowany jako BSTR (ponieważ to jest to, czego potrzebuje COM), więc opakowanie zbudowane na bazie BSTR jest cenne dla programistów COM.

8

IMO, std :: string nie jest wystarczająco duży, aby być rozpowszechnionym (Qt i wxWidgets są starsze niż STL, lub co najmniej starsze niż powszechnie dostępne stabilne i działające pliki STL). Ponadto std :: string niestety nie jest najlepszą klasą ciągów dla każdego, a inne frameworki mają inne potrzeby.

Uwaga! Poniższy akapit jest nieco niepoprawny, ale ma sens w komentarzach.

Na przykład, C++ STL jest bardzo ograniczone zasoby, podczas gdy klasa string Qt oferuje wiele gadżetów, których komisja nigdy by się nie zgodziła, szczególnie, że niektórzy chcą, aby był łatwy do wdrożenia w systemach wbudowanych i tym podobnych.

+0

Dzięki. Widzę, że odpowiadasz na drugi punkt. Czy nauczysz się "klasy" na każdej platformie, z którą pracujesz? Podobnie jak 'QString' i wyeliminować' std :: basic_string'? – AraK

+0

Rozsądnie jest decydować o typie ciągu znaków, który ma być używany w każdym projekcie, i starać się go trzymać. Mieszanie willy-nilly powoduje ból. Tak więc, w ciężkiej aplikacji Qt prawdopodobnie spróbuję użyć QString wszędzie, nawet w częściach, które nie używają bezpośrednio Qt. Jednakże, jeśli był niewielki część GUI Qt i duża część zależała od innego std :: string przy użyciu biblioteki (np. Zestaw narzędzi do wyszukiwarki stron), spróbowałbym użyć std :: string głównie i przekonwertować do/z QString tylko w część GUI. – Macke

+1

Nie zgadzam się z tym, że komitet C++ nie zgodziłby się z niektórymi funkcjami QString, ale Qt, w tym QString, był używany w systemach wbudowanych od wieków. –

7

Jednym z głównych problemów z std::string jest brak obsługi standardu Unicode. Nawet z std::wstring otrzymujesz tylko kontener dla punktów kodowych Unicode, ale nadal musisz wdrożyć funkcjonalność obsługującą Unicode.

Na przykład, QString jest "niejawnie udostępniony". Dzięki temu bardzo łatwo można przekazać ciągi znaków do kodu w efektywny sposób. Są one faktycznie kopiowane tylko przy pisaniu.

+1

Rzeczy stają się jeszcze bardziej skomplikowane dzięki UTF-8. –

+2

Możesz przechowywać utf-8 w std :: string. Przestań się mylić, Unicode z UTF-16. – anno

+0

Możesz przechowywać wszystko w 'std :: string', jest to wektor bajtowy. Mówię tylko, że nic w 'std :: string' nie pomaga w Unicode. Na przykład, gdzie mogę znaleźć metodę 'std :: string', która daje mi długość łańcucha znaków UTF-8? Nie sądzę, żebym coś pomieszał. –

2

IIRC Bjarne Stroustrup celowo pominął klasę String z C++, uważając ją za "rytuał przejścia". Wszyscy, którzy nauczyli się języka C++, mieli napisać własne. Z pewnością na początku C++ nie było żadnych standardowych bibliotek i pamiętam wersje z AT & T (która była preprocesorem dla C) i klasy NIH z bardzo pionierskiej grupy w National Institutes of Health w USA (która również zawierała wczesne klasy kolekcji).

0

Jednym z najemców C++ jest "Nie płacisz za to, czego nie potrzebujesz". Oznacza to, że nie musi istnieć klasa pasująca do jednego rozmiaru, którą każdy programista C++ MUSI znać i (co ważniejsze) musi KORZYSTAĆ. Może twój projekt wymaga ciągów bezpiecznych dla wątków. Możesz rzucić własną klasą. I zawsze masz możliwość użycia istniejącego std :: string.

Tak się składa, że ​​w większości przypadków std :: string jest wystarczająco dobry. Ale kiedy nie jest, nie cieszycie się, że nie jesteście w tym zamknięci. Spróbuj przetasować własną klasę String w Javie i sprawdź, ile czasu zajmuje jej wyciągnięcie włosów.

Co do drugiej kwestii, jeśli zamierzasz walczyć z biblioteką, którą dodałeś do swojego projektu, dlaczego najpierw dodałeś bibliotekę do swojego projektu? Częścią decyzji o użyciu wxWidgets lub QT jest potwierdzenie, że musisz objąć klasę swoich ciągów w swoim projekcie (lub co najmniej sporej części tego projektu). Podobnie jak decyzja o bibliotece "C" oznacza wstawienie buforów char * i parametrów rozmiaru na wszystkie funkcje.

Tak, tak, naucz się alternatywnej klasy ciągów. Jeśli używasz biblioteki (i chcesz stać się jej biegłym), nie możesz zignorować części biblioteki tylko dlatego, że "jest to kolejna klasa napisów". To nie ma sensu.

+0

To oświadczenie jest przeznaczone tylko w środowisku wykonawczym, nie kosztuje nic w czasie wykonywania, jeśli komitet standardów zdefiniował przyzwoitą klasę ciągów - więcej niż spowalnia okna, jeśli w sklepie jest więcej oprogramowania. –

+0

W jaki sposób klasa std :: string nie jest przyzwoita? – jmucchiello

2

std :: string jest świetny ... O, z tym wyjątkiem, że nie ma wywołania "Format()" ... I nie ma podziału() ani Join() ... Właściwie , nie robi wiele rzeczy, które użytkownicy ciągów w "gorszym" języku skryptowym biorą za pewnik ...

Jeśli C++ miał możliwość ADD do istniejących klas (jak Objective-C lub Ruby) to prawdopodobnie nie byłoby to zobaczyć ...

także rozważyć, że C++ na ogół nie lepiej (niż rzeczy, takich jak Java) na co pozwala tworzyć obiekty, które zachowują się jak prawdziwe rodzimych typów ...

+4

Zobacz http://www.boost.org/doc/libs/1_34_1/libs/format/index.html i http://www.boost.org/doc/libs/1_40_0/doc/html/string_algo.html . std :: string został już skrytykowany za posiadanie bezbożnej ilości funkcji składowych. Co powstrzymuje cię od dodawania funkcjonalności do klasy dzięki darmowym funkcjom? – UncleBens

+2

Tak, ma zbyt wiele metod, ale metody są w większości nieprzydatne. Można to zrobić lepiej, używając mniej użytecznych metod. –

+0

Punkt nie jest funkcjami składowymi a wolne funkcje. Chodzi o to, że biblioteka standardowa C++ w ogóle nie zapewnia tej funkcjonalności. – dan04

Powiązane problemy