Leser: 17
2014-05-26T19:49:14 tonewheelHallo zusammen,
momentan führe ich ein vor etlichen Jahren begonnenes C++ Studium weiter/bzw. frische auf. Excellente Bücher (Sutter, Koenig/Moo, Meyers) helfen dabei. Dabei stellt sich mir langsam aber sicher die Frage von Sinn und Nutzen. Im Augenblick sehe ich das so, dass es einfacher ist, ungekapselten C-Code mit Zeigern, structs, malloc und Konsorten zu benutzen, als sich in unendliche Definitionen von Konstruktoren, Templates und Operatorüberladungen zu stürzen, nur um Themen wie Kapselung und reusability gerecht zu werden. Was man an Komfort gewinnt, wird durch Umstand zunichte gemacht.
QuoteNoch besser als C wünscht man sich dann eher Perl, das viele(alle?) dieser Probleme außen vor lässt. Wären da nicht auch Sprachen wie z.B. Clojure. Hier hat man concourrency, immutability, funktionales Programmieren, und der Code ist sehr kompakt. Da stellt sich dann die Frage, ob Perl hier punkten kann, bzw. überlegen ist, gerade, was die letztgenannten Eigenschaften betrifft, die m.M. in Perl alle fehlen (außer Kompaktheit).
2014-05-26T21:28:34 Raubtier... Außerdem zwingt dich ja auch niemand, in C++ eigene Templates zu nutzen oder dich gar mit Variadic Templates auseinanderzusetzen. Man kommt mit der STL schon reichlich weit
2014-05-26T21:28:34 RaubtierUnd zuletzt: wenn du gerade dein C++ auffrischst, solltest du unbedingt aktuelle Literatur nutzen, da C++11 recht neu ist und sich doch viel geändert hat.
2014-05-26T21:49:33 rosti... und Bau einer beliebig erweiterbaren Factory sowie eine Implementierung von Traits ähnlich PHP als Perl-Packages.
2014-05-26T21:49:33 rostiSo war beispielsweise das hier http://rolfrost.de/kalenderprogramm.html heute nach einer Stunde fertig ;)
2014-05-27T15:26:30 murphyim Gegensatz zu einem endlosen C-Programm, das schon 100 Zeilen braucht, um einen einfachen Regex-Match auszuführen ;-)
1
2
3
4
5
std::string s("20140303T19:30:00");
boost::regex dateAndTimeRE(R"(\d{8}T?\d{2}:\d{2}:\d{2})");
if (boost::regex_match(s, dateAndTimeRE)) {
std::cout << "Format ist ok\n";
}
2014-05-27T17:55:19 RaubtierKlar, denn man kann Strings ja ändern.
[...]
Quote[...]
Daher also entweder einen lock_guard auf einen Mutex nehmen oder - vielleicht noch einfacher: nimm halt einfach einen const std::string
[...]
Quote[...]
(ab C++11 folgt aus const thread-safe).
2014-05-27T18:26:11 murphy2014-05-27T17:55:19 RaubtierKlar, denn man kann Strings ja ändern.
[...]
Und hundert Punkte bekommt der Kandidat, der auf Anhieb weiß, welche Methoden eines Strings diesen verändern und welche nicht, das ist nämlich alles andere als intuitiv und offensichtlich.
QuoteQuote[...]
(ab C++11 folgt aus const thread-safe).
Alleine die Tatsache, dass man erwähnen muss, dass das erst ab einer bestimmten Sprachversion gilt, lässt schon wieder tief blicken, wie schlecht designt C++ tatsächlich ist und wie verwirrend für Anfänger.
QuoteAußerdem lässt sich die Aussage, auch wenn sie für const Instanzen von std::string in bestimmten Versionen der STL gelten mag, nicht auf const Instanzen anderer Klassen übertragen.
QuoteSo können wir den ganzen Tag weitermachen und all die Stolperfallen in C++ und die Wege um sie herum aufzeigen. Bewiesen ist damit nur eines: Diese Sprache ist mächtig, aber kompliziert richtig zu benutzen.
2014-05-27T18:55:54 Raubtier2014-05-27T18:26:11 murphy2014-05-27T17:55:19 RaubtierKlar, denn man kann Strings ja ändern.
[...]
Und hundert Punkte bekommt der Kandidat, der auf Anhieb weiß, welche Methoden eines Strings diesen verändern und welche nicht, das ist nämlich alles andere als intuitiv und offensichtlich.
Im Gegensatz zu Perl sagt mir das mein Editor. Und wenn ich einen const string habe, schlägt er mir z.B. reserve gar nicht in der Code-Completion vor. Ausnahmsweise mal ein Punkt an C++ hier!
[...]
Quote[...]
QuoteQuote[...]
(ab C++11 folgt aus const thread-safe).
Alleine die Tatsache, dass man erwähnen muss, dass das erst ab einer bestimmten Sprachversion gilt, lässt schon wieder tief blicken, wie schlecht designt C++ tatsächlich ist und wie verwirrend für Anfänger.
Naja, du kannst in Perl 5.0 auch kein "say" verwenden. Der vorherige relevante Standard ist C++98, dort hatte man sich auf andere Dinge als Nebenläufigkeit konzentriert. Das Design folgt anderen Zielen.
[...]
Quote[...]
QuoteAußerdem lässt sich die Aussage, auch wenn sie für const Instanzen von std::string in bestimmten Versionen der STL gelten mag, nicht auf const Instanzen anderer Klassen übertragen.
Weil?
[...]
2014-05-27T19:23:57 murphyHast du das verlinkte Video mal angeschaut? Mutable heißt bitweise const oder thread-safe.2014-05-27T18:55:54 RaubtierWeil?
Zum Beispiel weil es mutable gibt, was dazu führt, dass const Methoden in einer const Instanz trotzdem etwas ändern können.
2014-05-27T19:33:19 Raubtier[...]
Hast du das verlinkte Video mal angeschaut?
[...]
Quote[...]
Mutable heißt bitweise const oder thread-safe.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
$ cat foo.cpp
#include <cstdio>
class foo {
private:
mutable int dawut;
public:
foo() : dawut(42) {
}
void showme() const {
printf("foo.dawut = %d\n", dawut);
}
void bar() const {
dawut = 23;
}
};
int main() {
const foo foo;
foo.showme();
foo.bar();
foo.showme();
return 0;
}
$ gcc -std=c++11 -O2 -Wall foo.cpp -o foo
$ ./foo
foo.dawut = 42
foo.dawut = 23
2014-05-27T20:29:40 murphyGanz offensichtlich ist es also in der verbreitetsten Implementation eines C++11 Systemes der Welt möglich, in einer const Methode in einer const Instanz einer Klasse ein Feld, welches mutable deklariert ist, zu verändern. Daraus folgt, dass const alleine keine Garantie für Threadsicherheit geben kann!