C++ Review Zusammenfassung

  • Ersteller Ersteller CBLukas
  • Erstellt am Erstellt am
C

CBLukas

Gast
Hallöchen

Ich habe eine C++-Zusammenfassung geschrieben für die Prüfung einer Informatik I Vorlesung für Elektrotechnik (deshalb die Bitfelder und anonymous unions, ...).
Wäre cool, wenn ihr euch das kurz ansehen könntet und eventuelle Fehler melden.
Ihr dürft sie auch selbst verwenden...

MfG Lukas

Anm.: Der Informatik II Teil kommt später noch...

Edit: Dürft natürlich auch schreiben, wenn ihr denkt es fehle noch etwas (ausser Algorithmen und Library-Dinge).
Edit: NEUE VERSION WEITER UNTEN IM THREAD
 

Anhänge

Zuletzt bearbeitet:
Puh, hab beim ersten Überfliegen ne ganze Menge gefunden. Ich antworte später nochmal, wenn ich Zeit habe.
 
Letzter Punkt der Checkliste:

"Never retured a referece to a local variable? "

retured => returned
referece => reference
 
So, mal das Gröbste, was mir beim Überfliegen auffällt:

DEFAULT DATATYPES
Heißen im Standard "integral types".
Größe in Bytes ist nicht definiert, außer für char - der muss ein Byte sein. Alle anderen Integer-Typen müssen größer sein und sind geordnet (char <= short <= int <= long int) usw. Die Größen passen aber auf üblichen Systemen. Vielleicht kann man ja sowas wie "usual size in bytes" dazu schreiben. bool kann übrigens auch gerne mal 4 Bytes haben.
wchar_t fehlt noch.
void hat keine Größe, auch nicht 0 Bytes. void ist ein unvollständiger Typ, der niemals ein vollständiger Typ sein kann.

INLINE TYPE SPECIFICATION
2LL - C++ 98 (mit 2003 Amandements) kennt kein long long, auch wenn viele Compiler es trotzdem fressen. g++ -pedantic-errors sollte meckern. Wie's mit dem neuen Standard aussieht, weiß ich gerade nicht, aber ich vermute, dass long long dann kein Problem mehr ist.

2.0f //f has no effect, float
nicht richtig - das definiert 2 als Float-Literal. Bsp:
Code:
void foo( float f);
void foo( double f);
void bar()
{
  foo( 2.0); // calls void foo( double f);
  foo( 2.0f); // void foo( float f);
}

VARIABLE/FIELD DECLARATION
Finde ich verwirrend, Benamung ist ungenau.
[storage-class-specifier] [cv-qualifier] [type]
cv-qualifier: [none], const, volatile, const volatile
storage-class-specifier: auto, register, static, extern, mutable

DECLARATION FLAGS
volatile: was volatile macht, ist im Standard unzureichend spezifiziert. Auf jeden Fall nicht (zwingend) das von dir beschriebene. Ist i.d.r. ein Hinweis, hier nicht zu optimieren.
register: ist ein Hinweis, dass dieses Objekt häufig benutzt wird. Ist aber nur ein Hinweis und nicht mehr als das - wird meistens ignoriert, spätestens wenn man die Adresse von dem Objekt nimmt
static: "The storage for these objects shall last for the duration of the program" (ausm Standard)

Find ich bis hierhin nicht so richtig gut, bzw. ungenau/unvollständig, je nach Anspruch des Lesenden. Allerdings würde die vollständige und genaue Variante bei weitem den Rahmen sprengen.

INITIALIZATION
int a, b = 5; //a = pseudo-random, b = 5
a ist "undefined".

TYPE CASTING
new_type expr2 = (new_type) expr1; // C-style cast
new_type expr2 = new_type (expr1); // can be Function-style cast or constructor + assignment operator call

a = float(7/2); /*a=3.5*/
Ohne gerade einen Compiler zur Hand zu haben, würde ich behaupten, dass das 3 ergibt.

static_cast, dynamic_cast, const_cast, reinterpret_cast fehlen.

C-style casts sind i.A. discouraged.

BASIC PROGRAM STRUCTURE
Es gibt kein iostream.h. Stammt aus Zeiten vor C++98 und so ziemlich kein Compiler bringt diesen Header mit.

OPERATOR PRECEDENCE & ASSOCIATIVITY
Wo ist * als dereference? Unary oder binary könnte hilfreich sein.
There are more commands like +=
operators

INCREMENT & DECREMENT OPERATOR
Irgendwas von prefix und postfix wäre evtl. hilfreich.

DYNAMIC MEMORY (NEW, DELETE)
int* c = new int (6); int* d = new int(3)[3]; //*c=6, d:error

REFERENCES
int &a; //error: refs are never null
refs require initialization

POINTER-ARITHMETICS
p = b; //assigns b‟s address to p
Ungenau. Führt die implizite array-to-pointer Conversion durch und weist den Wert p zu.

b = p; //error: b is const
b ist nicht const.

b[5] = 0; // b [offset of 5] = 0
Als Gag könnte man noch 5 = 0; aufnehmen. Ist das gleiche. ;)

FUNCTIONS / METHODS
<pedantisch>C++ kennt keine Methoden. Das Wort kommt nicht im Standard vor. Heißen member functions</pedantsch>
Willst du friend mit aufnehmen? Macht das Beschreiben aber ziemlich frickelig.
const(2nd) - hier geht auch volatile und const volatile.

ARGUMENTS
call by reference (pointer)
Ist allerhöchstens ein impliziter call by reference. Ein Pointer wird per value übergeben.

OVERLOADING
They have to have different footprints[/color=, so that the compiler (and you) know which one to take.
signature. Wobei ich erst exakt nachschlagen müsste, wie es korrekt heißt - auf jeden Fall nicht footprint. have to have klingt auch nach schlechtem Englisch - need to have wäre zumindest besser.

UNIONS
Ein Hinweis darf nicht fehlen, dass nur das Element gelesen werden darf, das zuletzt geschrieben wurde. Alles andere ist undefiniertes Verhalten.

EXCEPTIONS
inherit from std::exception

void foo() throw(); //cannot throw
will not throw ist besser. Wird trotzdem geworfen, wird std::terminate() aufgerufen.

catchen per const & wäre hübscher. throw by value, catch by const reference.

TYPEDEF
//now you can use bigint instead of int
long

CLASSES
In-class init is not permitted for non-static and non-const
verstehe ich nicht.
Ansonsten redundant zu struct.

CONSTRUCTOR
//construct b first, then a
Falsch. Die Reihenfolge in der Initialisierungsliste ist irrelevant.

There is a default constructor doing nothing, if not specified
Falsch. Für jeden Member wird der Default-Constructor aufgerufen. Der Default-Konstruktor wird nur synthetisiert, wenn es keinen anderen gibt.
Im Falle deiner Deklaration class C { C (int); }; würde keiner synthetisiert.

Implicit type cast: C foo = 4;
Ruf einen conversion constructor auf, falls vorhanden.

Implicit init: C foo(4);
Nennt sich "direct initialization". "Implicit init" finde ich mindestens misleading.

Explicit init: C foo = C(4);
Nennt sich "copy initialization". Ebenfalls misleading. Hier wird übrigens in keinem Fall ein Zuweisungsoperator aufgerufen.

The keyword explicit inhibits copy initialization.
Implicit init not allowed for constructor without args:
A foo(); /*error*/ A foo; A bar = A(); //ok

misleading. A foo() deklariert eine Funktion namens foo ohne Parameter mit Rückgabetyp A.
A foo(); /*error: function declaration*/ A foo; A bar = A(); //ok

COPY-CONSTRUCTOR
If not specified: bit by bit copy.
Falsch. Für jeden Member wird der Zuweisungsoperator aufgerufen.

class A { A(A & copyFromMe) { … } … };
Referenz ist nicht notwendig. Und wenn, dann i.a.R. eine const-Referenz, da das Objekt, von dem Kopiert wird, nicht verändert werden sollte. (principle of least surprise)

STATIC & CONST VARIABLES
static variables’ memory is not freed
doch, am Programmende. Inklusive Destruktor-Aufruf.

INHERITANCE
friend-methods can never be inherited
Besser: friendship does not inherit.

Die Beschreibungen finde ich misleading. Am besten weg mit dem Beispiel bei public.

DYNAMIC BINDING

Das Wort static hat dort nichts verloren. Das far more performant ist ist falsch. "a tiny, tiny, tiny bit more performant" wäre wesentlich realitätsnäher. Ab besten garnicht erwähnen.

OVERRIDING OPERATORS & TYPE CASTS

operator int(){ return 4;} //typecast
ist kein cast. Definiert einen user defined conversion operator.

int main(){int i = 2; return i.operator+(1);} //ok
äääh.....? ;)

NAMESPACES
evtl. using-Direktiven und using-Deklarationen unterscheiden?

POLYMORPHISM
C-style casts haben bei Klassen (und eigentlich in jedem guten C++-Programm) nichts verloren. Viele, viele, viele gemeine Fallstricke. Ist der Typ z.B. unvollständig, wird der Zeiger einfach vergewaltigt.

extern void f(L*); //some standard function

TEMPLATES
finde ich gefährlich, soooo kurz abzuhandeln.

<IOSTREAM> - INPUT & OUTPUT STREAMS
cout << “foo”; //console out
write to stdout

cerr << “foo”; //console error
write to stderr with flushing after each operation

clog << “foo”; //console log
write to stderr without flushing after each operation

<CCTYPE> - CHARACTER FUNCTIONS
char toupper(char);
Nope, das ist int toupper( int).
Übergeben werden darf ein unsigned char oder EOF.

POSSIBLE MISTAKES / CHECKLIST

Arrays with non-const size
kann ich mir nix drunter vorstellen.

There is no ‘null’ in C/C++
Was meinst du damit?
 
@7H3 N4C3R: Vielen, vielen Dank für den riesen Aufwand, den du dir gemacht hast. Du bist besser als jeder Informatik-Tutor =) Wirklich 1A. :):):)
There is no ‘null’ in C/C++
Was meinst du damit?
Damit meinte ich, dass man sich nicht darauf verlassen kann, dass "NULL" oder "null" definiert ist, sondern 0 schreiben soll. Ich glaube der g++-Compiler wollte das nicht mit -pedantic.

Edit: Zur Constructor-Reihenfolge: Meine Formulierung war misleading, aber:
Constructors are executed in the order they appear in the list of bases except that a virtual base is always constructed before classes derived from it.
von http://www-plan.cs.colorado.edu/diwan/class-papers/mi.pdf

Nochmals vielen, vielen Dank

Edit: loooooool, der mit dem 5 ist hammer ;)
 
Zuletzt bearbeitet:
ACluk90 schrieb:
Damit meinte ich, dass man sich nicht darauf verlassen kann, dass "NULL" oder "null" definiert ist, sondern 0 schreiben soll. Ich glaube der g++-Compiler wollte das nicht mit -pedantic.
Doch doch, NULL ist definiert:

The macro NULL, defined in any of <clocale>, <cstddef>, <cstdio>, <cstdlib>, <cstring>, <ctime>, or <cwchar>, is an implementation-defined C + + null pointer constant in this International Standard (18.1).
NULL ist außerdem in C++ definiert als entweder 0 oder 0L. Ob man besser 0 oder NULL schreibt, darüber gehen die Meinungen auseinander, mit guten Begründungen beiderseits. Google am Besten mal danach, mach Dir einfach ein eigenes Bild davon und dann kannst du dich für eine Variante entscheiden und konsequent anwenden. Hauptsache, du weißt warum. :)

ACluk90 schrieb:
Edit: Zur Constructor-Reihenfolge: Meine Formulierung war misleading, aber [...]
Worauf ich hinauswollte ist, dass die Reihenfolge in der Initialisierungsliste nichts zu sagen hat. Virtuelle Vererbung ist eh noch so ein grausiger Spezialfall. Hab ich bis jetzt noch nie gebraucht.

Also, Beispiel:
Code:
class A
{
  private:
    std::string x;
    std::string y;
  public:
    A() : y( "Hallo"), x( y) {}
};
Sieht richtig aus? ;) Stürzt ab. x wird immer vor y konstruiert. Da y da noch nicht erzeugt wurde, knallt das. Die Reihenfolge der Memberdeklarationen ist entscheidend, nicht die Reihenfolge der Initialisierungsliste.


ACluk90 schrieb:
Nochmals vielen, vielen Dank

Edit: loooooool, der mit dem 5 ist hammer ;)

Gern geschehen.

Und 5 - naja, ist unverständlich, aber logisch. *g* Der Indexoperator für Builtins ist definiert als:
e1[e2] -> *(e1 + e2)

Und dann ist es egal, in welcher Reihenfolge man es schreibt - und ebenso trifft es dann auch auf den Indexoperator zu. Immer schön, um zu verwirren. *fg*
 
Lädst du die Fehlerbereinigte Version auch bitte wieder hoch? Würds mir auch gern ma angucken und würde dann auch Fehler die mir noch auffallen hier posten
 
7H3 N4C3R schrieb:
storage-class-specifier: auto, register, static, extern, mutable
Darf man keine davon kombinieren?
7H3 N4C3R schrieb:
p = b; //assigns b‟s address to p
Ungenau. Führt die implizite array-to-pointer Conversion durch und weist den Wert p zu.

b = p; //error: b is const
b ist nicht const.
Ist ein Array nicht einfach ein const pointer?
7H3 N4C3R schrieb:
In-class init is not permitted for non-static and non-const
verstehe ich nicht.
Ansonsten redundant zu struct.
Damit wollte ich sagen, dass eine Instruktion wie "class A{ static const foo=5;}" nur zulässig ist, wenn foo wirklich static und const ist. Stimmt das?
7H3 N4C3R schrieb:
POLYMORPHISM
C-style casts haben bei Klassen (und eigentlich in jedem guten C++-Programm) nichts verloren. Viele, viele, viele gemeine Fallstricke. Ist der Typ z.B. unvollständig, wird der Zeiger einfach vergewaltigt.
Ja... das kommt vom Vorlesungsaufbau her xD. Wir begannen mit C und fuhren mit C++ fort, ohne klaren Schnitt. Das richtige C++-style casten hatten wir nie. Ich werde die richtigen C++-casts bei den Casts nun aufführen, aber für Polymorphie weglassen (sonst wird der Abschnitt riesig).
7H3 N4C3R schrieb:
INHERITANCE
[...]
Die Beschreibungen finde ich misleading. Am besten weg mit dem Beispiel bei public.
Welches Beispiel?
7H3 N4C3R schrieb:
TEMPLATES
finde ich gefährlich, soooo kurz abzuhandeln.
Werde ich (muss ich fast) mal so drin lassen, weil ich das was dort steht in der Prüfung haben werde, aber nicht mehr..
7H3 N4C3R schrieb:
There is no ‘null’ in C/C++
Schreibt man NULL oder null oder geht beides?

Darf man sich array als const pointer vorstellen? Also:
int * const a; /* <==> */ int a[]; //bis darauf, dass man bei der pointer-version das memory selbst verwalten muss?

Ist das korrekt, dass man bei einer sauberen Implementierung im Destructor einer child-Class denjenigen der parent-Class aufrufen muss, oder ist das nur so, wenn man diese parent-class virtual geerbt hat?

@Kuddlmuddl: Jup, hier schonmal eine grösstenteils verbesserte Version (bis auf die Punkte, zu denen ich die Frag aufgeschrieben habe)


Allgemein: Bei der ganz finalen Version werde ich versuchen, sie wieder auf 4 Seiten zu packen.

Vielen Dank nochmal für eure Mithilfe.

Edit: NEUE VERSION WEITER UNTER
 

Anhänge

Zuletzt bearbeitet:
ACluk90 schrieb:
Darf man keine davon kombinieren?
Ich sehe spontan nicht, dass es sinn machen würde.

ACluk90 schrieb:
Ist ein Array nicht einfach ein const pointer?
Nein. Ein Array ist ein Array und ein Pointer ein Pointer. ;) Tolle Erklärung... *g*

Ein Array ist ein zusammenhängender Block im Speicher, der Objekte eines konkreten Datentyps beinhaltet.

Ein Pointer zeigt (typisiert) auf eine Speicheradresse.

Um mit Arrays "sinnvoll" arbeiten zu können, konvertiert ein Array in den allermeisten Fällen implizit in einen Zeiger auf sein erstes Element. Das nennt sich array-to-pointer-conversion. Deshalb "fühlen" sich Pointer und Arrays auch sehr ähnlich an, aber sind zwei völlig verschiedene Paar Schuhe. Darüber sollte man sich bewusst sein.

ACluk90 schrieb:
Damit wollte ich sagen, dass eine Instruktion wie "class A{ static const foo=5;}" nur zulässig ist, wenn foo wirklich static und const ist. Stimmt das?
Ah, das meinst du. :) Jepp. Weiß garnicht wie die aktuelle Compiler-Situation ist - zumindest ältere Compiler fressen das manchmal nicht. Dann hilft immernoch der "enum-Hack":
Code:
class A
{
  enum Bar{
    foo = 1
  };
};

ACluk90 schrieb:
Ja... das kommt vom Vorlesungsaufbau her xD. Wir begannen mit C und fuhren mit C++ fort, ohne klaren Schnitt. Das richtige C++-style casten hatten wir nie. Ich werde die richtigen C++-casts bei den Casts nun aufführen, aber für Polymorphie weglassen (sonst wird der Abschnitt riesig).
Auf jeden Fall solltest du dir die C++-Casts anschauen und genau verstehen, was welcher Cast macht und warum ein C-cast je nach Context sich wie einer von static_cast, const_cast oder reinterpret_cast verhalten kann (dynamic_cast ist da ausgeschlossen). Und diese Kontextabhängigkeit macht die Dinger in C++ doch ziemlich gefährlich.

ACluk90 schrieb:
Welches Beispiel?
"Orange ist eine Frucht" oder so ähnlich. Beispiele aus der echten Welt, ohne großen Kontext, können einem ganz schnell falsch ausgelegt werden. Denn letztendlich bedeutet öffentliche Verebung die Umsetzung des Liskov Substituion Principle (LSP - findet man auf Wiki). Schlimmer wäre aber "Quadrat ist ein Rechteck". ;) Das ist ein Fall, wo "reale Welt" und Softwareentwicklung definitiv nicht zusammen passen. ;)

ACluk90 schrieb:
Schreibt man NULL oder null oder geht beides?
NULL. null gibt's nicht. Mit dem neuen Standard soll nullptr kommen, was die Probleme mit NULL beseitigt.

ACluk90 schrieb:
Darf man sich array als const pointer vorstellen? Also:
int * const a; /* <==> */ int a[]; //bis darauf, dass man bei der pointer-version das memory selbst verwalten muss?
Siehe oben. Hoffe, das macht es klar. :)

Edit hierzu:
Etwas genauer: Nach der array-to-pointer-conversion ist der Pointer ein rvalue. Kann also auch nicht zugewiesen werden.

Falls du nicht weißt was lvalues und rvalues sind - unbedingt mal anschauen. :)

ACluk90 schrieb:
Ist das korrekt, dass man bei einer sauberen Implementierung im Destructor einer child-Class denjenigen der parent-Class aufrufen muss, oder ist das nur so, wenn man diese parent-class virtual geerbt hat?
Der Destruktor des Parents wird so oder so automatisch aufgerufen, dagegen kannst du gar nichts tun. ;) Spannender ist es eher - wenn ich meine Klasse so gestaltet habe, dass von ihr öffentlich geerbt werden kann (d.h. Kindklassen können existieren), dann muss ich entweder den Destruktor virtual oder aber protected machen, damit entweder über den virtuellen Aufrufmechanismus der richtige Destruktor aufgerufen wird, oder aber der Destruktor nicht öffentlich zugreifbar ist (sondern nur von einer abgeleiteten Klasse, die gerade zerstört wird).

HTH
 
Zuletzt bearbeitet:
INITIALIZATION
wieso nochmal "int d = 1, e = 0; f;" ?
War doch alles schon zuvor

BASIC PROGRAM STRUCTURE
entweder "using namespace std;" oder "std::" beim cout ergänzen

ARRAYS
Ich finde hier sollte man erwähnen, dass man in schönem C++ Arrays durch vectoren ersetzt. Zumindest hab ich das öfter in C++-Tuts gelesen.
http://www.parashift.com/c++-faq-lite/containers.html#faq-34.1

SCOPES AND STATIC VARIABLES
evtl nur Erbsenzählerei, aber
if (1==1) int myInt = 1;
erlaubt zukünftig keine Verwendung von myInt, weils bei if/else die Kurzform ohne {} gibt.

IF ... [ELSE IF ...] [ELSE ...]
wieso doppelt "else if (b==c) { bar(); }"
Wenn du sagen wolltest, dass es mehrere "else if" geben kann würde ich ja auch wenigstens unterschiedliche Bedinungen und aufgerufene Methoden im Beispiel verwenden.

INLINE
Ich glaube Kompiler sehen das eher als Vorschlag, als als Befehl. Siehe sonst http://www.parashift.com/c++-faq-lite/inline-functions.html

Uns so als Ergänzung:
Was mich persönlich immer wieder nervt ist die Konvertierung von Zahlen zu c-Arrays, was ich dann meist mit sprintf hinmurkse. Ka ob das die beste Lösung ist und obs überhaupt mit reinsoll. Ist nur ein häufiges Problem bei mir. (itoa geht ja nicht für alle Datentypen).

Ka, obs bei euch Thema war. Aber wenns um exakte Pfeile und Ecken-Rundungen geht evtl zum Klassen- und Vererbungs-Thema auch ein winziges UML Diagramm, was einmal schnell 3 Klassen mit Komposition und Aggregation zeigt.
http://de.wikipedia.org/wiki/Klassendiagramm
 
kuddlmuddl schrieb:
INITIALIZATION
wieso nochmal "int d = 1, e = 0; f;" ?
War doch alles schon zuvor
korrigiert.
BASIC PROGRAM STRUCTURE
entweder "using namespace std;" oder "std::" beim cout ergänzen
korrigiert
ARRAYS
Ich finde hier sollte man erwähnen, dass man in schönem C++ Arrays durch vectoren ersetzt. Zumindest hab ich das öfter in C++-Tuts gelesen.
http://www.parashift.com/c++-faq-lite/containers.html#faq-34.1
Weiter unten bei den Erläuterung von Teilen der Standardlibrary. Habe noch etwas dazugeschrieben.
SCOPES AND STATIC VARIABLES
evtl nur Erbsenzählerei, aber
if (1==1) int myInt = 1;
erlaubt zukünftig keine Verwendung von myInt, weils bei if/else die Kurzform ohne {} gibt.
Kann ich mir nicht vorstellen, weil dadurch nicht klar ist, was passiert, wenn die if-Bedingung nicht erfüllt würde. Bist du dir da sicher?
IF ... [ELSE IF ...] [ELSE ...]
wieso doppelt "else if (b==c) { bar(); }"
Wenn du sagen wolltest, dass es mehrere "else if" geben kann würde ich ja auch wenigstens unterschiedliche Bedinungen und aufgerufene Methoden im Beispiel verwenden.
korrigiert
INLINE
Ich glaube Kompiler sehen das eher als Vorschlag, als als Befehl. Siehe sonst http://www.parashift.com/c++-faq-lite/inline-functions.html
korrigiert und etwas umgestaltet
Uns so als Ergänzung:
Was mich persönlich immer wieder nervt ist die Konvertierung von Zahlen zu c-Arrays, was ich dann meist mit sprintf hinmurkse. Ka ob das die beste Lösung ist und obs überhaupt mit reinsoll. Ist nur ein häufiges Problem bei mir. (itoa geht ja nicht für alle Datentypen).
Code-Bespiel eingefügt und zwar folgendes:
Code:
#include <sstream> /* ... */
std::ostringstream buf; float f = 1.234567; 
buf.precision(4); buf << f; //1.235
std::string s = buf.str();  //f = 10.345 -> 10.35
const char* cs = s.c_str();
MSVC-Compiler v10 schluckt das. Müsste nicht auch #include <string> included werden?
Edit: Blöder Überlegungsfehler. Hat sicher erledigt.
Ka, obs bei euch Thema war. Aber wenns um exakte Pfeile und Ecken-Rundungen geht evtl zum Klassen- und Vererbungs-Thema auch ein winziges UML Diagramm, was einmal schnell 3 Klassen mit Komposition und Aggregation zeigt.
Ein Klassendiagramm habe ich schon in der Zusammenfassung, allerdings im (evtl. noch) komplett unvollständigen Teil. Eventuell werde ich den später auch noch fertigstellen. Für die Informatik II Prüfung (eig. Datenstrukturen, Alorithmen, Java u.a. (auch Klassendiagramme und so) sind bei uns jedoch keine Hilfsmittel erlaubt, wodurch die Priorität dieses Teils etwas tiefer ist. Vormutlich werde ich den schon noch vervollständigen, allerdings erst im August - nach der grossen Basisprüfung.
Ergänzung ()

@7H3 N4C3R:
Whoops, habe deinen Beitrag vorhin gar nicht gesehen.
Vielen Dank für alle deine Infos, ich glaube jetzt ist alles klar.
Das mit dem LSP werde ich heute Abend nachlesen ;)


An alle: Wenn die finale Version rauskommt, kann ich euch PNen. Wenn ihr das wollt, postet einfach irgendeine Antwort in den Thread.
Wenn ich Datenstrukturen und Algorithmen wirklich noch zusammenfasse, werde ich dafür einen neuen Thread starten.
Konstruktive Kritik zu dieser Zusammenfassung ist natürlich weiterhin willkommen.
 

Anhänge

Zuletzt bearbeitet:
Kleine Anmerkung zu "CONVERT FLOAT TO STRING"
In dem Beispiel startest du mit 1.234567 und packst es in buf sodaß dann 1.235 in buf stehen sollte, da vorher nochmal precision(4) aufgerufen wird. Dann verwendest du buf.str() um einen std::string zu erhalten. Dieser soll laut Kommentar 10.35 enthalten?

Grüße
Rossibaer

PS: Nimm mich mal mit auf die Verteilerliste für die finale Version. Hab da großes Interesse an dieser Übersicht.
 
Ich wäre an der finalen Version auch sehr intressiert. Wollte eh schon immer mal mit C++ anfangen :)
 
Hätte sie auch gerne :)
Poste doch sonst einfach hier, da kriegen es dann bestimmt noch mehr mit, die die neuste Version haben wollen
 
Zurück
Oben