PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Jetzt lerne ich C++



Sym
27-10-2004, 15:33
Hallo,

nach sehr intensiver Java-Erfahrung, bin ich jetzt gezwungen, C++ zu lernen. Ich habe mir dafür das Buch von André Willms "C++ Programmierung" vom Addison-Wesley Verlag zugelegt. Das Buch richtet sich an Fortgeschrittene und Profis.

Im Prinzip ist es Java ziemlich ähnlich. Das mit den Pointern und Refererzen werde ich dann hoffentlich in dem Projekt lernen.

Jetzt habe ich aber ein Problem. Ich habe erfahren, dass es zum einen bei C++ keine Packages gibt und weiter sollte man die Definitionen in einer header-Datei tätigen und in der c-Datei die Implementation vollführen. Dabei kommt es jetzt zum ersten Mal auch dazu, dass ich andere Dateien includen muss (was bei Java nicht so schwer ist).

Meine Programm sieht wie folgt aus:

#include <iostream>
#include <Matrix.h>

int main (int argc, char * const argv[]) {
// insert code here...
std::cout << "Hello, World!\n";
//Matrix m;
return 0;
}
Meine Matrix.h sieht so

/*
* Matrix.h
* MeCevis
*
* Created by LaMi on Wed Oct 20 2004.
* Copyright (c) 2004 __MyCompanyName__. All rights reserved.
*
*/

//#ifndef MATRIX
//#define MATRIX

//#include <Carbon/Carbon.h>

class Matrix {

private:
int dimZ, dimS;

public:
Matrix();
int getRows(void);

};

//#endif
aus.

Ich wollte eigentlich gleich mit der IDE xcode anfangen, versuche mich aber auf grund der Probleme zunächst mit dem gcc.

gcc main.cpp
main.cpp:2:22: Matrix.h: No such file or directory
Die Dateien liegen aber im gleichen Verzeichnis. Was mache ich hier falsch (weitere Fragen folgen, wenn das hier abgeschlossen ist ;))?

P.S.: ich sollte hier noch erwähnen, dass sowas in dem Buch leider nicht behandelt wird. Es kommt nicht eine Kompilation vor und nirgends wird was included (oh grauss).

locus vivendi
27-10-2004, 16:18
Hallo,
nach sehr intensiver Java-Erfahrung, bin ich jetzt gezwungen, C++ zu lernen.
Sieh es als Chance :-)


Im Prinzip ist es Java ziemlich ähnlich. Das mit den Pointern und Refererzen werde ich dann hoffentlich in dem Projekt lernen.
Jupp, ein wenig vorher anlesen kann nicht schaden, aber so schwer zu verstehen ist beides nicht.



Jetzt habe ich aber ein Problem. Ich habe erfahren, dass es zum einen bei C++ keine Packages gibt und weiter sollte man die Definitionen in einer header-Datei tätigen und in der c-Datei die Implementation vollführen.
Vorsicht mit der Terminologie: Eine Funktions-Definition z.B. sollte meistens nicht in einem Header stehen. Das Sprachfeature von C++ welches Java packages am nächsten ist, sind übrigens Namespaces.


Die Dateien liegen aber im gleichen Verzeichnis. Was mache ich hier falsch
Probiere statt

#include <datei>

#include "datei"
Die Form mit den spitzen Klammern ist soweit ich weiß, eigentlich nur für System-Header. Von der Form (Klammer oder Anführungszeichen) hängt nämlich die Such-Reihenfolge für die benannte Datei ab.

Sym
27-10-2004, 16:30
Hi,

danke erst einmal für die Antwort. Die Veränderung bringt folgendes Problem:

gcc main.cpp
ld: Undefined symbols:
std::ios_base::Init::Init[in-charge]()
std::ios_base::Init::~Init [in-charge]()
std::cout
std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)
___gxx_personality_v0

locus vivendi
27-10-2004, 16:39
Das ist jetzt aber ne FAQ: Gib statt "gcc" "c++" (oder "g++") ein und schau trotzdem in das gcc manual (info gcc). Dort wird nämlich an prominenter Stelle beschrieben wie man damit C++ Programme kompiliert und linkt.

Sym
27-10-2004, 16:59
*ouch* - ok, das habe ich nun gelernt. Ich habe in der ManPage gelesen, aber das übergangen. Dachte, der Compiler erkennt das schon. :rolleyes:

Naja, jetzt bin ich bei folgendem Problem

g++ Matrix.o main.cpp
main.cpp: In function `int main(int, char* const*)':
main.cpp:7: error: conversion from `Matrix*' to non-scalar type `Matrix'
requested

Ich habe die Klasse Matrix.cpp wie folgt implementiert und dann ein Object-File draus gemacht.

/*
* Matrix.cpp
* MeCevis
*
* Created by LaMi on Wed Oct 20 2004.
* Copyright (c) 2004 __MyCompanyName__. All rights reserved.
*
*/

#include "Matrix.h"
#include <iostream>

Matrix::Matrix() {

//dimZ = 0;
//dimS = 0;

}

int Matrix::getRows(void) {

return dimZ;

}

Ach ja, der Fehler kommt nur dann, wenn ich in der main-Datei Matrix m auch instanziiere (= new Matrix();. Ich blättere und lese. doch leider ist mir das noch nicht klar. Leider habe ich auch kein wirklich gutes Tutorial dazu gefunden. :(

wraith
27-10-2004, 17:28
Ja,ja die Java-Programmierer ;).

Mit Matrix m; hast du bereits eine Instanz von Matrix erzeugt (dh. der Konstruktor wurde aufgerufen), die auf dem 'Stack' liegt.Und du kannst jetzt damit arbeiten.
Wenn der Programmfluß den Scope von b verläßt, wird der Destruktor von Matrix aufgerufen.

Die zweite Variante ist, du legst deine Matrix mit new auf dem Heap an.
Das wolltest du machen, dazu brauchst du aber einen Zeiger (ist Java ist das alles etwas versteckt).
Also Matrix *m = new Matrix;, hier bist du jetzt aber selber dafür verantwortlich, diese Matrix wieder zulöschen (mit delete).

Sym
27-10-2004, 17:33
Oh, danke.

Danke an Euch beide. Jetzt habe ich einiges mehr verstanden. Damit kann ich dann schon besser arbeiten. :)

Sym
27-10-2004, 17:34
Ja,ja die Java-Programmierer ;).

Mit Matrix m; hast du bereits eine Instanz von Matrix erzeugt (dh. der Konstruktor wurde aufgerufen), die auf dem 'Stack' liegt.Und du kannst jetzt damit arbeiten.
Wird damit dann immer der Standardkonstruktor aufgerufen? Oder kann man das ändern?

wraith
27-10-2004, 17:38
Wird damit dann immer der Standardkonstruktor aufgerufen? Oder kann man das ändern?
Wenn du einen Standardkonstruktor (also ein Konstruktor, der keine Parameter erwartet) hast, dann wird er damit aufgerufen (ansonsten gibt es einen Compilerfehler).
Wenn du einen Konstruktor hast, der Parameter erwartet, dann mußt du die mit übergeben, zb. Matrix m(2,2);.

Sym
27-10-2004, 18:23
Wenn du einen Standardkonstruktor (also ein Konstruktor, der keine Parameter erwartet) hast, dann wird er damit aufgerufen (ansonsten gibt es einen Compilerfehler).
Wenn du einen Konstruktor hast, der Parameter erwartet, dann mußt du die mit übergeben, zb. Matrix m(2,2);.
Oh, das ist gut. Dann weiß ich, wie ich das zu handeln habe. So, ich gehe dann jetzt mal auf den Freimarkt. Noch allen einen schönen Abend. ;)

anda_skoa
28-10-2004, 16:33
*ouch* - ok, das habe ich nun gelernt. Ich habe in der ManPage gelesen, aber das übergangen. Dachte, der Compiler erkennt das schon. :rolleyes:


War ja auch richtig gedacht. Der gcc hat schon erkannt, dass es sich um C++ Code handelt und ihn auch entsprechend kompiliert, nur der Linker konnte dann die nötige Implementation der C++ Standardbiblithek nicht linken, weil ihm niemand gesagt hat, wie die heißt.
Wenn man g++ verwendet, passiert das automatisch.

Btw, noch ein Kommentar zu Auftrennung in Header und Source File: man kann wie in Java alle Methoden inline im der Klassendeklaration schreiben, nur hat das unter anderem zur Folge, dass bei einer Änderung in einer Datei, alle davon abhängigen Dateien auch neu kompiliert werden müssen.

Darum lagert man die Implementation in eine extra Datei aus (man verwendet da den Begriff "Übersetzungseinheit"), dann muss nur diese eine Datei neu kompiliert werden und der Linkerschritt für das gesamte Programm wiederholt werden.

Ciao,
_