Anfängerfragen
-
Hallo,
ich hab bis jetzt eigentlich nur php, javascript und html gecodet. Naja und (lacht mich nicht aus) Blitzbasic :D. Vor Zeiten habe ich mal ein Buch über C++ gelesen, aber das hat nur an der Obefläche von allem gekratzt (OOP nur das nötigste und sonst halt alles was mach braucht um in der Windows Konsole sein Alter aus dem Geburtsdatum zu berechnen). Bei 2 weiteren Büchern habe ich bei der Hälfte gar nicht erst weitergelesen. MFC - Nein Danke! (Ubuntu lässt grüßen!) Dann war erstmal lange Zeit Pause angesagt, bis ich vor einer Wochen einen C++ Kurs im I-net endeckt habe -> Und zu Einzelheiten aus dem Kurs hab ich jetzt viele billige Fragen, die bestimmt jeder hier beantworten kann.Zusammenfassung für Lesefaule:
will C++ Lernen
nutze Ubuntu
Vorraussetzungen: php, javascript, html und *hüstel* Blitzbasic
favorisierter Kurs http://www.cpp-tutor.de/
hab viele dumme Fragen
wenn ihr nichts dagegen habt, wird dies mein Sammelthread dafürSoviel zu EInführung, hier meine erste Frage:
in Bezug auf
CAny ncObject1, CRes; const CAny cObject2; CRes = ncObject1 + ncObject1; CRes = ncObject1 + cObject2; CRes = cObject2 + ncObject1; CRes = cObject2 + cObject2;wurde diese Klasse geschrieben:
//Original von cpp-tutor class Complex { double real; // Realanteil double imag; // Imaginäranteil public: .... Complex operator + (Complex& op2); Complex operator + (const Complex op2); Complex& operator + (Complex& op2) const; Complex& operator + (const Complex op2) const; };Das versteh ich eigentlich ganz gut, bis darauf was das & vor "operator +" bei der 3. und 4. Operatorenüberladung da zu suchen hat und was es bewirkt!?
So, und dann nochwas, was mich brennend interesiert:
Ich habe grade in einem Thread gelesen, dass man mit C++ auch theoretisch ein OS gecodet werden könnte (btw: wurde UNIX/Linux nicht mit C/C++ programmiert oder ist das ein Mythos?). Wie würde man solche binären Programme schreiben und welchen Compiler müsste man benutzen, dass man dann ja theoretisch Boot-fähige Programme hat?lg Julian
-
Hallo,
"&" ist der Referenz-Operator. Damit sagst du dem Compiler, dass von dem Inhalt
einer Variablen keine Kopie erzeugt werden, sondern dass er eine Referenz
auf die Originalvariable halten soll.Unix/Linux ist zum groessten Teil in C geschrieben. Aber eben nicht ganz. Wenn
mich recht erinnere, waren es beim 2.4er Kernel ca. 8000 Zeilen Assembler Code
und ca. 8Millionen Zeilen C-Code.Ob man dafuer rein nur C nutzen kann, weiss ich nicht genau. Zumindest weiss
ich, dass der GCC eine Option bereitstellt, mit der man entsprechende Binaries
erzeugen kann.gruss
v R
-
Okay Danke! Zwar komme ich damit zwar immernoch nicht ganz klar, aber bin der Sache schon näher

Ehm weitere Frage:
Hab grad ein bisschen rumgetestet und da ist mir etwas eigenartiges aufgefallen:#include <iostream> using std::cout; using std::endl; int var = 255; int *pointer = &var; //Version 1 int main() { cout << *pointer << endl; }Dieser Code wird verhlerfrei compiliert!
#include <iostream> using std::cout; using std::endl; int var = 255; int *pointer; int main() { pointer = &var; //Version 2 cout << *pointer << endl; }Dieser auch!
#include <iostream> using std::cout; using std::endl; int var = 255; int *pointer; pointer = &var; //Version 3 int main() { cout << *pointer << endl; }Aber hier liefert g++ den Fehler:
expected constructor, destructor, or type conversion before >>=<< (man ne fette Tabelle mit Sonderzeichen aber keine franz. Gänsefüßchen dabei) tokenWarum?
lg Julian
-
Du kannst zwar global Variablen deklarieren und sie gleich initialisieren, aber keine Anweisungen ausführen.
Die Zeilepointer = &var; //Version 3in die Main packen und es sollte wieder kompiliert werden.
-
Außerhalb einer Funktion dürfen nur Deklarationen und Definitionen stehen, aber keine Anweisungen -
int *pointer = &var;ist eine Definition (mit Initialisierung),int* pointer; pointer = &var;ist eine Definition und eine anschließende Anweisung (Variablenzuweisung). Der Unterschied klingt zwar nur minimal, ist aber in C++ durchaus bedeutend (vor allem weil bei einer freistehenden Anweisung nicht festgelegt werden kann, wann sie aufgerufen werden soll).Im Inneren einer Funktion wäre Variante 3 übrigens erlaubt.
-
Achso, danke!
So die nächste Frage:
Ich hab mal zum üben meine eigene string-Klasse geschrieben. Klappte auch bis zum Zuweisungsoperaor und der Memberfunktion für die Länge ganz gut, Probleme macht mir nur der << Operator für die Klasse "ostream".#include <iostream> using std::cout; using std::endl; class string { char *inhalt; public: string& operator = (const char *src); friend ostream& operator << (ostream& os, string& src); int getLen(); }; string& string::operator = (const char *src) { const char *pTemp; pTemp = src; int char_counter = 0; while(*pTemp != 0) { *pTemp++; char_counter++; } delete [] inhalt; inhalt = new char[char_counter+1]; pTemp = src; for(int i = 0;i <= char_counter;i++) { inhalt[i] = *pTemp++; } return *this; } ostream& operator << (ostream& os, string& src) { os << src.inhalt; return os; } int string::getLen() { const char *pTemp; pTemp = inhalt; int char_counter = 0; while(*pTemp != 0) { *pTemp++; char_counter++; } return char_counter; } int main() { string text; text = "Dieser Text wurde abgelegt in einer String-Klasse, wie man sie niemals zuvor gesehen hat!"; //cout << text; cout << endl; return 0; }Ausgabe:
jejay@ubuntu:~/cpp$ compile
test.cpp:12: Fehler: ISO-C++ verbietet Deklaration von »ostream« ohne Typ
test.cpp:12: Fehler: »ostream« ist weder eine Funktion noch Elementfunktion; kann nicht als »friend« deklariert werden
test.cpp:12: Fehler: expected »;« before »&« token
test.cpp:41: Fehler: expected constructor, destructor, or type conversion before »&« tokenAllerdings habe ich mich streng an der Lektion "Überladen spezieller Operatoren" des C++ Tutorials auf cpp-tutor (http://www.cpp-tutor.de/cpp/le12/le12_05.htm) orientiert

Vielen Dank
lg Julian
-
Du hast per 'using' ja auch nur die Namen 'std::cout' und 'std::endl' in den globalen Namensraum gezogen. Also entweder du setzt noch ein 'using std::ostream;' an den Anfang des Programms oder du gibst den vollen Namen in den Parameterlisten mit an.
(im Zweifelsfall hilft auch ein 'using namespace std;' - aber dann könnte es passieren, daß deine Klasse 'string' mit 'std::string' kollidiert)
-
Ups Peinlich daran hab ich nicht gedacht! Naja Anfängerfehler *g*