C++ Globale Variabeln

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
oli_f
Beiträge: 272
Registriert: 24.10.2003 12:27:05

C++ Globale Variabeln

Beitrag von oli_f » 29.06.2005 11:33:33

Meine Frage ist wohl recht trivial aber ich habe gerade etwas den Durchblick verloren :)

Ich habe folgenden Programmaufbau:

main.cpp:

Code: Alles auswählen

int GLOBAL = 1;
#include <unterklasse.h>
<code>

unterklasse.h:

Code: Alles auswählen

#include <oberklasse.h>
<code>
unterklasse.cpp mit irgendwelchem code


oberklasse.h:

Code: Alles auswählen

<code>
oberklasse.cpp mit irgendwelchem code


Wenn ich in main.cpp eine Globale Variable einbaue (wie im Beispiel), meldet der Kompiler "undeclarde symbol" für alle Zugriffe aus unterklasse.cpp oder oberklasse.cpp. Wenn ich jedoch die globale Variable in oberklasse.h deklariere meldet der Linker "multiple definition" wohl weil die Variable beim kompillieren von unterklasse.cpp oberklasse.cpp und main.cpp jedesmal erzeugt wird.

Wie mache ich denn eigentlich eine globale Variable die aus jedem Programmteil aufrufbar und vorallem auch veränderbar (also nichts mit #define) ist?

grüsse oli
error - divided by 0

Benutzeravatar
Savar
Beiträge: 7174
Registriert: 30.07.2004 09:28:58
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin

Beitrag von Savar » 29.06.2005 11:48:15

indem du die Variable in den Klassen als "extern int GLOBAL;" deklarierst.. dann weiß er, dass es da noch eine Variable gibt, erzeugt aber keine neue (hoffe mein Gedächtnis spielt mir nicht grad einen Streich)
MODVOICE/MYVOICE
Debianforum Verhaltensregeln
Log Dateien? -> NoPaste

oli_f
Beiträge: 272
Registriert: 24.10.2003 12:27:05

Beitrag von oli_f » 29.06.2005 12:05:48

Ev verstehe ich dich nicht ganz, aber die Variabeln sind in keiner Klasse definiert sondern eben global. jedenfalls gehts mit extren nicht. Mit static gienge es, aber ich sollte sie ja eben verändern können.
error - divided by 0

Benutzeravatar
Savar
Beiträge: 7174
Registriert: 30.07.2004 09:28:58
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin

Beitrag von Savar » 29.06.2005 12:07:23

ich meinte ja auch nicht direkt in den Klassen, sondern in den Dateien der Klassen

also oben in der unterklasse.h und in der oberklasse.h noch:

Code: Alles auswählen

extern int GLOBAL;
<DEINCODE>
MODVOICE/MYVOICE
Debianforum Verhaltensregeln
Log Dateien? -> NoPaste

Benutzeravatar
peschmae
Beiträge: 4844
Registriert: 07.01.2003 12:50:33
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: nirgendwo im irgendwo

Beitrag von peschmae » 29.06.2005 12:11:45

Dass globale Variablen eh böse sind brauche ich wohl eigentlich gar nicht zu sagen. Naja, ich mach strotzdem ;)

MfG Peschmä
"er hätte nicht in die usa ziehen dürfen - die versauen alles" -- Snoopy

oli_f
Beiträge: 272
Registriert: 24.10.2003 12:27:05

Beitrag von oli_f » 29.06.2005 12:49:09

@savar : genau so hab ichs probiert und es brachte nix.
@peschmae : ich brauch die einfach als Parameter für einen Algorithmus. Ich lasse sie per Flags beim Programmaufruf setzen und dann werden sie nicht mehr verändert. Wenn du mir dazu eine schönere Lösung hast, her damit :)
error - divided by 0

Benutzeravatar
Savar
Beiträge: 7174
Registriert: 30.07.2004 09:28:58
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Berlin

Beitrag von Savar » 29.06.2005 13:02:19

bei mir läufts wunderbar:

main.cpp:

Code: Alles auswählen

#include "untermain.h"

int meine_var = 2;

int main(void) {
        testklasse meintest;
        return 0;
}
untermain.cpp:

Code: Alles auswählen

#include <stdio.h>

extern int meine_var;

class testklasse {
        public:
                testklasse() { printf("Erzeugt: %i\n",meine_var);} 
        
}
Ablauf:

Code: Alles auswählen

check@tne:/tmp$ g++ -o testprog main.cpp 
check@tne:/tmp$ ./testprog 
Erzeugt: 2
check@tne:/tmp$ 
MODVOICE/MYVOICE
Debianforum Verhaltensregeln
Log Dateien? -> NoPaste

Benutzeravatar
peschmae
Beiträge: 4844
Registriert: 07.01.2003 12:50:33
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: nirgendwo im irgendwo

Beitrag von peschmae » 29.06.2005 13:31:38

oli_f hat geschrieben: @peschmae : ich brauch die einfach als Parameter für einen Algorithmus. Ich lasse sie per Flags beim Programmaufruf setzen und dann werden sie nicht mehr verändert. Wenn du mir dazu eine schönere Lösung hast, her damit :)
Naja, irgendwie halt
1) als Funktionsparameter quer durchs Programm transportieren bzw. bei den Aufrufen mitgeben
2) in der Klasse wo du die Dinger kennst als statische Variablen hintun und dan mit get-Methoden aus dem Algo darauf zugreifen
3) ein Singleton machen
4) sonst was

Kommt natürlich auch auf den konkreten Fall an was am besten ist.

Ich meine grundsätzlich kann das mit globalen Variablen schon am einfachsten und direktesten sein - ist halt einfach nicht gutes Design (wobei was das ist darüber kann man sehr lange streiten).

MfG Peschmä
"er hätte nicht in die usa ziehen dürfen - die versauen alles" -- Snoopy

oli_f
Beiträge: 272
Registriert: 24.10.2003 12:27:05

Beitrag von oli_f » 29.06.2005 13:55:33

@savar : ok habs nicht ganz begriffen gehabt. jetzt gehts, merci!

@peschmae : Naja erstens ist mein Programm nicht allzu gross (ca 8 Seiten Quelltext) und zweitens muss ich etwa 15 Parameter mitgeben können. Da müsste ich schon fast ein struct nur für die Parameterübergabe schreiben. Finde es so nicht nur einfacher sondern eigentlich auch schöner, da ich ansonsten die Parameter in die Klassendeklarationen quetschen müsste.
error - divided by 0

Benutzeravatar
peschmae
Beiträge: 4844
Registriert: 07.01.2003 12:50:33
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: nirgendwo im irgendwo

Beitrag von peschmae » 29.06.2005 14:57:21

oli_f hat geschrieben: @peschmae : Naja erstens ist mein Programm nicht allzu gross (ca 8 Seiten Quelltext) und zweitens muss ich etwa 15 Parameter mitgeben können. Da müsste ich schon fast ein struct nur für die Parameterübergabe schreiben. Finde es so nicht nur einfacher sondern eigentlich auch schöner, da ich ansonsten die Parameter in die Klassendeklarationen quetschen müsste.
Ok, bei so ganz kleinen Programen liegt das schon drin. :D
Bei 15 Parametern wirds natürlich schon etwas schwieriger da was sauber und übersichtlich hinzukriegen.

MfG Peschmä
"er hätte nicht in die usa ziehen dürfen - die versauen alles" -- Snoopy

Antworten