[Gelöst] OOP Globale Variablen und mehrer Dateien.

torro

Still Fresh
Joined
Jan 24, 2009
Messages
370
Re: OOP Globale Variablen und mehrer Dateien.

<t>Genau das denke ich auch, in den Projektfiles sind auch so gut wie keine Einstellungen. Versuch mal den Order /home/lecramos/.codeblocks zu löschen, dann sollte code::blocks wieder "unkonfiguriert" sein.<br/>
Viel Erfolg</t>
 

torro

Still Fresh
Joined
Jan 24, 2009
Messages
370
Re: OOP Globale Variablen und mehrer Dateien.

<r>Ja Eclipse kann ich auch nur empfehlen. War gezwungen das auf der Arbeit zu benutzen und nun bin ich überzeugt <E>:)</E></r>
 

LecramOS

Newbie
Joined
Feb 20, 2010
Messages
121
Age
35
Location
Pandora.
LOCATION
Pandora.
Re: OOP Globale Variablen und mehrer Dateien.

<r>Danke für eure zahlreichen Beiträge. <E>:)</E> <br/>
<br/>
Nun läufts. <E>:confused:??</E> <br/>
<br/>
Ich habe erst Code::Blocks gelöscht gehabt und auch diesen versteckten Ordner, den torro angegeben hat, gelöscht.<br/>
Code::Blocks neu installiert und es ging immer noch nicht.<br/>
<br/>
Dann habe ich mich damit abgefunden, dass ich wahrscheinlich zu Banane bin Code::Blocks zu bedienen und Netbeans und auch Eclipse probeweise installiert. <br/>
<br/>
Netbeans finde ich nicht so toll JohnDavidson <E>:)</E> Habe aber auch nur kurz mal rein geguckt. <br/>
<br/>
Bei Eclipse finde ich die Autovervollständigung echt gut, müsste mich jedoch "jetzt" mit Makefiles auseinander setzen, weil man da für jede Kleinigkeit selber ein Makefile schreiben muss. Das soll nicht Sinn der Sache sein, weil ich nämlich SDL lernen will und dazu OOP. Da kann ich mich mit den Makefile gedöns auch noch später Rum schlagen.<br/>
<br/>
Nun fehlte mir aber Code::Blocks und ich konnte mich damit nicht abfinden dieses Problem nicht zu lösen.<br/>
<br/>
Festplatte Formatiert. Neues Ubuntu 9.10 drauf. Alles Aktualisiert. Code::Blocks drauf . Code neu geschrieben <br/>
und BAMM , er kompilierte es. <E>:-D</E> <br/>
<br/>
Ich konnte nun die Variablen in einen Header deklarieren u. initialisieren mit " const int a = 10; " und habe diese globale_vars.h Datei in die funktion.h gelegt. <br/>
Da die funktion.h sowohl in main.cpp und auch in funktion.cpp aufgerufen wird sind dort die Variablen für die Funktion und aber auch für die MainFunktion verfügbar .<br/>
<br/>
<B><s></s>Hier nun weitere Fragen<e></e></B> <E>:)</E> <br/>
1-Der Compiler sagt mir wenn ich globale_vars.h jeweils in main.cpp und funktion.cpp inkludiere, dass <br/>
die Variablen doppelt deklariert sind. Warum aber nicht wenn ich zweimal funktion.h, jeweils in den beiden cpp dateien, mit inkludiere. ?<br/>
<br/>
2-Die Variablen der Beiden Aufrufe der funktion.h besitzen unterschiedliche Speicheradressen. Warum ?<br/>
<br/>
3-Warum wird nicht auch der Doppelaufruf von globalen_vars.h (in main.cpp und funktion.cpp) in verschiedene Speicheradressen aufgeteilt und somit das Problem der Doppeldeklaration umgangen ? <br/>
<br/>
4-warum ist es schon wieder 22 Uhr ? <E>:-D</E> <br/>
<br/>
<B><s></s>EDIT: <br/>
-Frage 1 hat sich erledigt. Ich hatte total vergessen, #ifndef #define und #endif zu benutzen. Nun kann man den Header, mit den Variablen drin, beliebig einsetzten.<br/>
-Frage 3 hat sich damit auch erledigt.<br/>
-Frage 2 hat sich damit auch erledigt.<br/>
Wäre nur schön, wenn man nicht doppelten Speicheraufruf hätte, aber dafür soll ja glaube ich dann diese <br/>
"Singleton Class" sein, dass man die Variablen wirklich nur an einer Speicherstelle hat.<br/>
Eigentlich soweit nun alles Klaro.<e>
</e></B> <E>:juhu:</E> <br/>
<br/>
<IMG src="http://img709.imageshack.us/img709/6623/bildschirmfotowk.png"><s>
</e></IMG><br/>
<br/>
<IMG src="http://img709.imageshack.us/img709/8224/bildschirmfoto1r.png"><s>
</e></IMG><br/>
Habe da "static" aus testzwecken stehen. Geht auch mit const. <br/>
<br/>
<IMG src="http://img716.imageshack.us/img716/7018/bildschirmfoto2o.png"><s>
</e></IMG><br/>
<br/>
<IMG src="http://img709.imageshack.us/img709/1558/bildschirmfoto3.png"><s>
</e></IMG></r>
 

LecramOS

Newbie
Joined
Feb 20, 2010
Messages
121
Age
35
Location
Pandora.
LOCATION
Pandora.
Ich dachte man "muss" das Makefile selber generieren. Habe mich ein wenig von Eclipse abschrecken lassen wegen diesen Tutorial "http://www.admin-wissen.de/eigene-tutorials/programmierung/eclipse-workshop/workshop-seite-14/".

Wenn ich bei Eclipse als Projekt das Hello World anwähle kompiliert er es ja auch problemlos.
Wenn ich aber ein Leeres C++ Projekt anwähle und das Hello World selber schreibe Kompiliert er es nicht und gibt einen Fehler aus wo er dann das makefile will.
Code:
undefined reference to `main'
collect2: ld returned 1 exit status
make: *** [test] Fehler 1
 

Evil Azrael

Newbie
Joined
Jan 20, 2010
Messages
109
Location
Rheinkilometer 666 & hinter Heidelberg
Website
www.evilazrael.de
ICQ
78819723
WEBSITE
http://www.evilazrael.de
LOCATION
Rheinkilometer 666 & hinter Heidelberg
Nimm's mir nicht übel, aber ich glaub das Problem sitzt vor dem Monitor :p

Wie sieht deine main() denn aus? Solange du im Projektassistenten Executable auswählst, sollte alles ok sein.

Ich hatte vor 3 Jahren mal einige IDEs verglichen, ist immer noch der Top-Artikel in meinem Blog: http://www.evilazrael.de/archives/12-Kleiner-C++-IDE-Vergleichstest.html
CodeLite wurde mir von Besuchern empfohlen, das macht auch einen sehr guten Eindruck. http://codelite.org

Ich würde dir aber anraten, erstmal mit so einem kleinen Testprogramm den üblichen Compile & Link Zyklus und vielleicht ein einfaches Makefile zu erlernen. Einfach für das Verständnis. Wie steht es bei Selfhtml so schön: "Die Energie des Verstehens".
 

LecramOS

Newbie
Joined
Feb 20, 2010
Messages
121
Age
35
Location
Pandora.
LOCATION
Pandora.
Ist doch immer so, dass das Problem vor den Monitor sitzt. :ph34r:

Warum sollte ich endlos lange Zeilen in der Konsole tippen wenn es gute IDE's gibt.
Hat sich nicht umsonst jemand daran gesetzt und diese entwickelt weil er sich nämlich auch dachte
"Boaahh, endlos lange Zeilen schreiben für so einen Pille Palle Kram. Das muss doch auch besser und einfacher gehen".

Das Leben ist vieeel zu kurz um sich jetzt in die Vergangene Geschichte einzuarbeiten.
Am besten man schreibt alles noch selbst in Maschinensprache, was ?
Compiler sind doch nur was für Looser, ne ?
Also ich finde, man sollte sich im hier und jetzt zurechtfinden und nicht in der Vergangenheit.

Natürlich sollte man sich Sachen wie Makefiles und was weiß ich nicht noch alles angucken und es Verstehen.

Aber einen Anfänger damit zu konfrontieren ist fast schon Mord, weil dieser Anfänger nämlich schon genug mit den Syntax von C++ zu tun hat und sogar noch Wäsche waschen muss.

Da macht es mir Code::Blocks echt einfach.

Bei Eclipse ist das auf Executable gestellt geht aber trotzdem nicht.
Den Code hier unten habe ich aus dem Hello World Projekt raus geschrieben.
Der nimmt auch die Klasse nicht auf. Liegt wahrscheinlich daran, dass ich etwas am Makefile ändern müsste
wovon ich aber zur Zeit noch NULL Plan habe.

Da macht es mir Code::Blocks wieder schön einfach. Weswegen ich wohl auch vorläufig bei Mister Code::Blocks Bleiben werde obwohl Eclipse auch echt gut ist.

Aber ich kann ja immernoch später umsteigen, wenn sich die Makefilegeschichte bei mir mal eingebrannt hat. :)
Code:
//============================================================================
// Name        : bnlub.cpp
// Author      : LecramOS
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================


#include <iostream>
using namespace std ;

#include "klasse.h"

int main(void) {

	Auto Benz ;


return 0 ;

}
Code:
class Auto {

 private:

	  int seineLaenge ;

 public:

	  Auto() { seineLaenge = 2 ; }
	  ~Auto() ;

	  void gebeLaenge( int seineLaenge ) ;
	  int  nehmeLaenge() { return seineLaenge ; }

};
FEHLER:
Code:
<i>
</i>**** Build of configuration Debug for project bnlub ****

make all 
Building file: ../src/bnlub.cpp
Invoking: GCC C++ Compiler
g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/bnlub.d" -MT"src/bnlub.d" -o"src/bnlub.o" "../src/bnlub.cpp"
Finished building: ../src/bnlub.cpp
 
Building target: bnlub
Invoking: GCC C++ Linker
g++  -o"bnlub"  ./src/bnlub.o ./src/klasse.o   
./src/bnlub.o: In function `main':
/home/lecramos/EclipseWorkspace/bnlub/Debug/../src/bnlub.cpp:20: undefined reference to `Auto::~Auto()'
collect2: ld returned 1 exit status
make: *** [bnlub] Fehler 1
EDIT: Und am besten wäscht man seine Wäsche noch mit der Hand. Wer brauch den schon Waschmaschinen, ne ?
Man muss doch die Basis des Wäsche waschens verstehen.


EDIT2: Nehme mir das bitte auch nicht übel. :p
 

Evil Azrael

Newbie
Joined
Jan 20, 2010
Messages
109
Location
Rheinkilometer 666 & hinter Heidelberg
Website
www.evilazrael.de
ICQ
78819723
WEBSITE
http://www.evilazrael.de
LOCATION
Rheinkilometer 666 & hinter Heidelberg
Also.. zum einen haben Makefiles nix mit C++ zu tun. Mit Makefiles kann man alles machen, so kochen oder Wäsche.
Und einfache sind nicht schwer, sondern bestehen immer aus
Code:
Ziel: Voraussetzungen
    Befehl1
    Befehl2
    usw
Die Befehle werden durch ein Tab eingerückt. Am ende der Befehlskette sollte das Ziel erstellt sein.
Beispielsweise
Code:
funktion.o: funktion.h funktion.cpp global_vars.h
  g++ funktion.cpp -c -o funktion.o
Die erste Zeile sagt, um funktion.o zu erstellen braucht man funktion.h funktion.cpp und global_vars.h. Diese müssen nicht erstellt werden, aber falls eine von denen neuer ist als die funktion.o, dann erstelle funktion.o bitte neu. Das -c sagt dem Compiler "führe den linker schritt nicht aus, sondern erstelle ein kompiliertes object-file.

das gleiche machen wir nochmal für die main (beispielhaft)
Code:
main.o: main.cpp funktion.h global_vars.h
   g++ main.cpp -c -o main.o
Und am Ende linken wir alles zusammen:
Code:
test.exe: main.o funktion.o
    g++ main.o funktion.o -o test.exe
Und zusammen Makefile:
Code:
funktion.o: funktion.h funktion.cpp global_vars.h
  g++ funktion.cpp -c -o funktion.o

main.o: main.cpp funktion.h global_vars.h
   g++ main.cpp -c -o main.o

test.exe: main.o funktion.o
    g++ main.o funktion.o -o test.exe
make test.exe
sollte dann die exe einschliesslich (geänderter) Voraussetzungen erstellen.

Kompliziert, oder? Das Einfügen der global_var.cpp ist dem interessierten Schüler zur Übung überlassen.
 

LecramOS

Newbie
Joined
Feb 20, 2010
Messages
121
Age
35
Location
Pandora.
LOCATION
Pandora.
Hast mich überzeugt :)
Ich beschäftige mich nun erst mal mit den Makefiles und Wechsel auch zu Eclipse.
Ist bestimmt allgemein besser wenn ich diese Make Geschichte endlich verstehe.
Weil ich stoße ja immer wieder da drauf. Danke .

EDIT: Also die einfachen makefiles sind echt einfach wenn man einmal weiß wie es geht.
Hast du wirklich sehr gut beschrieben.
:)

-- Di Mär 16, 2010 17:32 --

Ach... Eclipse ist doch Scheiße X-(

Ich gehe auf File->New->C++-Projekt->Executable->Empty Project ... und erstelle ein "Hallo Welt"...

Gehe auf "Build"Debug"for Project" und der gibt mir nur Fehler raus.

Ich dachte mit dieser Executable Funktion erstellt der selber die Makefiles :huh:

Da vergeht ein echt die Lust bei so einer IDE.

EDIT: Was für ein auf und ab .Ich nehme alles zurück.
Mann muss halt auch erst mal wissen, dass man bei dieser IDE selber sein Code speichern muss, bevor er ihn kompiliert. Das hat Code::Blocks und Co. ja selber gemacht wenn man kompiliert hat.
:confused:??
 
Top