globale struktur (im modul definiert, und dennoch in der main() bekannt !!



  • globale struktur (im modul definiert, und dennoch in der main() bekannt !!

    also ich möchte ne struktur definieren ! und zwar net in der .h sondern nur in der
    .cpp .. also modul datei !

    es soll aber dennoch möglich sein in der main() eine variable vom typ dieser struktur zu erstellen !

    ahso ich will die struktur auch auf keinen fall in der .h definieren !! jedenfalls nicht so das man dort etwas über ihren aufbau erkennen könnte !

    bsp:
    functions.cpp

    struct meinestruct
    {
    int nummer;
    string text;
    }

    main.cpp

    int main()
    {
    meinestruct tmp;

    }



  • aha ! so ! ich sahg , Pimpl ! http://c2.com/cgi-bin/wiki?PimplIdiom

    voll krass dass !



  • sorry bin noob 😞

    kannste mir mal genauer sagen wie ich das nu hinschreiben soll ?

    und es soll auch mit g++ zu kompelieren sein

    also was schreib ich in die funtions.cpp
    was in die functions.h ??
    und was in die main.cpp ??



  • xdsmpDS schrieb:

    sorry bin noob 😞

    kannste mir mal genauer sagen wie ich das nu hinschreiben soll ?

    und es soll auch mit g++ zu kompelieren sein

    also was schreib ich in die funtions.cpp
    was in die functions.h ??
    und was in die main.cpp ??

    Du mußt das mit deinem Eingabegerät (Tastatur) durch Bewegen der Hände und Finger eingeben. ABer ich weiß leider nicht ganz genau, was du damit bezwecken willst und was genau du willst. Wer programmieren will sollte sich artikulieren können. Denn darum geht es auch in einer Programmiersprache. Beschreibung und Lösung eines Problemes. Nur wesentlich formaler.



  • sorry aber ich will immer noch das gleiche wie in meinem ersten post !

    und ich hab echt keine ahnung was der kram auf http://c2.com/cgi-bin/wiki?PimplIdiom
    mit meinem problem zu tun hat !
    da steht irgendwas von klassen destruktoren und son kram !

    ich hab aber keine klassen ! ich will auch keine !
    ich will nur ne structur in nem modul definiert haben und in der main()
    ne variable vom typ dieser struktur erstellen !

    und es soll dan sowas gehn:
    ----------------------------
    main()

    meinestruktur feld[500];

    dateieinlesen(feld);
    feldsortieren(feld);
    feldausgeben(feld);
    ----------------------------

    funktionen und struktur definition sollen sich in nem modul befinden !!!

    wenn ich die struktur aber nur in der moduldatei definiere, dann ist sie dem main unbekannt !

    die struktur soll aber nicht aus der main()/main.cpp oder den headern der moduldateien zu erkennen sein !



  • dann kanst du nur einen pointer auf die struct oder einen index(handle) benutzen und in deinem modul eine funktion zur erzeugung und freigabe der instanz(en) erstellen und alle funktionen die mit diesen daten arbeiten bekommen den pointer oder index als parameter übergeben



  • warum willst du sie eigentlich nicht in der Headerdatei definieren?
    Du kannst auch versuchen in der HeaderDatei einmal

    struct Meinestruct;
    

    zu schreiben.
    Und die inner Cpp dann richtig zu defnieren, wird aber wohl auch zu ungenügenden ERgebnuissen kommen



  • Ich bin mir nicht ganz sicher wie es bei Structs geht aber bei einfachen build-in Variablen geht es folgendermassen:

    Header:

    extern int a;
    

    cpp module:

    int a;
    

    cpp main:

    int main()
    {
        cout<<a<<endl;
    }
    

    I gehe davon aus dass to dein struct im Header declariren musst. Und die Instance als mit dem extern Keyword declariren und dan als ganz gewöhnliche die Instance in dem Module definieren. Das würde dann so aussehen:

    Header:

    struct A{
        int x;
    };
    extern A a;
    

    cpp module:

    A a;
    

    cpp main:

    int main()
    {
        cout<<a.x<<endl;
    }
    

    Wie gesagt ungetestet!

    Du kannst auch versuchen in der HeaderDatei einmal

    struct Meinestruct;
    

    zu schreiben.

    Wenn man eine Structur so declariert reicht das noch nicht einmal eine Instance zu erschaffen! Legendlich Pointers sind möglich und auch dann kann man kein Member verändern.



  • Hallo!

    Meines wissens musst du die struct mit dem Schlüsselwort export deklarieren;
    ----------------------------------
    Beispiel:

    Export struct bsp
    {
    int a;
    string b;
    }
    ----------------------------------
    Nun ist die Struktur soweit ich weiss auch der Main bekannt, auch wenn sie in ner .cpp datei liegt.



  • achjaa... da habe ich ein semikolon vergessen; (ganz am ende)



  • Export? Das ist mir aber ganz neu.

    Irgendwer hat schon gezeigt wie du das erreichen kannst, was du willst. Du
    deklarierst in einer Headerdatei deine Struktur als extern und in einer
    Implementationsdatei machst du dann die Strukturdeklaration.

    @tobidope: Bitte doch etwas freundlicher, es war ja klar was gemeint war. wir
    wolln doch net gleich jeden verkraulen.

    mfg
    v R



  • Also extern verhilft einem nicht dazu eine Variable in deinem main anzulegen, sondern sagt nur das man eine extern schon angelegte Variable benutzen kann.

    Wenn ich dein Problem richtig verstanden haben dann solltest du das volgendermassen machen:

    f.h

    struct Meinestruktur;
    
    dateieinlesen(Meinestruktur[]);
    feldsortieren(Meinestruktur[]);
    feldausgeben(Meinestruktur[]);
    

    Die Sache hier nennt sich Deklaration

    f.cpp

    struct Meinestruktur{
      int x;
      int y;
    }
    
    dateieinlesen(Meinestruktur[]){
      ...
    }
    feldsortieren(Meinestruktur[]){
      ...
    }
    feldausgeben(Meinestruktur[]){
      ...
    }
    

    Das ist die Definition, die wohl oder uebel ja irgendwo bekannt sein muss, so aber halt nicht in der .h, aber wenn du die irgendwann nur als Objekt File zur Verfuegung hast dann reicht es, und keiner sieht mehr deine Implementierung.

    Dann kannst du:
    main.cpp

    #include "f.h"
    int main(){
    
      meinestruktur feld[500];
    
      dateieinlesen(feld);
      feldsortieren(feld);
      feldausgeben(feld); 
    
      return 0;
    }
    

    Musst dann allerdings beim linken die Objekt oder die .cpp Datei von f angeben.

    Gruß

    Entyl Sa



  • virtuell Realisticer schrieb:

    Export? Das ist mir aber ganz neu.

    Irgendwer hat schon gezeigt wie du das erreichen kannst, was du willst. Du
    deklarierst in einer Headerdatei deine Struktur als extern und in einer
    Implementationsdatei machst du dann die Strukturdeklaration.

    @tobidope: Bitte doch etwas freundlicher, es war ja klar was gemeint war. wir
    wolln doch net gleich jeden verkraulen.

    mfg
    v R

    Nein, ich habe ihm die Lösung zu seinem Problem genannt. Anders geht es nicht. Ansonsten muss er die Programmiersprache wechseln. Er wird ein Struktur ohne Deklaration nicht verwenden können.



  • @Entyl_Sa
    meinestruktur feld[500]; in der main geht so nicht,
    da er ja die grösse der struct nicht kennt kann er dieses array nicht anlegen, als folge kommt ein kompilerfehler

    möglich ist z.b. das folgende:

    f.h:

    #ifndef F_H
    #define F_H
    
    struct Meinestruktur; 
    
    struct Meinestruktur* feldanlegen(int count);
    void feldzerstoeren(struct Meinestruktur *feld);
    void feldeinlesen(struct Meinestruktur *feld); 
    void feldsortieren(struct Meinestruktur *feld); 
    void feldausgeben(struct Meinestruktur *feld);
    
    #endif
    

    f.cpp:

    #include "f.h"
    
    struct Meinestruktur
    {
    	int x;
    	int y;
    };
    
    struct Meinestruktur* feldanlegen(int count)
    {
    struct Meinestruktur *feld = 0;
    
    	// ....
    	return feld;
    }
    
    void feldzerstoeren(struct Meinestruktur *feld)
    {
    	// ....
    }
    
    void feldeinlesen(struct Meinestruktur *feld)
    {
    	// ....
    }
    
    void feldsortieren(struct Meinestruktur *feld)
    {
    	// ....
    }
    
    void feldausgeben(struct Meinestruktur *feld)
    {
    	// ....
    }
    

    main.cpp:

    #include "f.h"
    
    void main(void)
    {
    	struct Meinestruktur *feld;
    
    	feld = feldanlegen(500);
    	feldeinlesen(feld);
    	feldsortieren(feld);
    	feldausgeben(feld);
    	feldzerstoeren(feld);
    }
    


  • Jetzt stellt sich nur noch eine Frage, was für einen Sinn hat das ganze?



  • kapselung

    die implementierung dieses modules kann völlig unabhängig vom rest des programms verändert, erweitert, .... werden (solange sich die public funktionen nicht verändern), und dies ohne, das eine neu-kompilation der anderen module nötig ist



  • warum fragst du eigentlich? 😉

    dein genanntes "Pimpl Idiom" geht doch unter anderem auch in diese richtung



  • bozo schrieb:

    warum fragst du eigentlich? 😉

    dein genanntes "Pimpl Idiom" geht doch unter anderem auch in diese richtung

    Deshalb wundere ich mich ja, es gibt funktionierende, dokumentierte und allgemein bekannte Alternativen. Wieso sollte man es anders machen?



  • @tobidope

    diese methode ist doch auch funktionierend, dokumentiert und allgemein bekannt 🙂
    und auch noch länger im gebrauch, da sie schon in c benutzt wurde

    es gibt nun mal nicht nur eine möglichkeit etwas zu tun, oft sind es mehrere, z.b. kann man auch statt des pointers im obrigen beispiel einen index benutzen

    warum man etwas anders machen sollte? weil es jenach genauem anwendungsfall einige unterschiede gibt, und nicht immer alle lösungsvarianten gleich gut passen

    (
    nicht so ernst zu nehmende antwort wäre ->

    warum sollte man c++ nutzen, es gibt doch c, warum c, es gibt doch asm, .....
    warum sollte man ...... (kannst etwas einsetzen), es gibt doch .....

    😉

    )



  • Aber wenn man C will, sollte man auch nicht unbedingt C++ nutzen. Berichtige mich, aber auf x und y kann er in obiem Beispiel nicht zugreifen, oder?


Anmelden zum Antworten