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ür

    Soviel 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) token

    Warum?

    lg Julian



  • Du kannst zwar global Variablen deklarieren und sie gleich initialisieren, aber keine Anweisungen ausführen.
    Die Zeile

    pointer = &var; //Version 3
    

    in 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 »&« token

    Allerdings 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*


Anmelden zum Antworten