Funktion in einer "spziellen Klasse" zugreifen



  • Was spricht denn gegen sowas?

    foo.hpp

    namespace Globals
    {
       CTeague_ServerFrame* Frame;
    }
    

    main.cpp

    void OnInit()
    {
       Globals::Frame = new CTeague_ServerFrame(0);
    }
    

    bar.cpp

    void bar::on()
    {
      Globals::Frame->setlistbox();
    }
    


  • Ich hatte ein sehr gutes Gefühl als ich deinen Vorschlag compiliert habe ^^, nur dann bekomme ich folgenden Error:

    C:/SourceCode/Libraries/wxWidgets2.8/include/wx/app.h:(.bss+0x0): multiple definition of `Globals::Frame'

    Mhhh



  • Da hilft es ein extern vor die Deklaration zu setzen.



  • Braunstein schrieb:

    Da hilft es ein extern vor die Deklaration zu setzen.

    Ist es so gemeint?

    #include "CTeague_ServerMain.h"
    
    namespace Globals
    {
       extern CTeague_ServerFrame* Frame;
    }
    

    undefined reference to 'Globals::Frame'

    Danke für eure Hilfe.



  • im header (wo du den ptr deklarierst), sollte das extern davor.

    im source (wo du den ptr definierst bzw initialisierst), sollte _kein_ extern davor...

    bb



  • So, ich schätze mal das ich genau das bereits gemacht habe, was du vorgeschlagen hast.
    Nun habe ich folgendes Problem (ich habe meine neue Header Datei jetzt einfach zentral includiert):

    D:\projects\CTeague_Server\foo.hpp|5|error: expected constructor, destructor, or type conversion before '*' token|

    Es bezieht sich auf folgende Zeile:
    CTeague_ServerFrame* Frame;

    Vielen Dank :-))



  • mmarcel1 schrieb:

    So, ich schätze mal das ich genau das bereits gemacht habe, was du vorgeschlagen hast.
    Nun habe ich folgendes Problem (ich habe meine neue Header Datei jetzt einfach zentral includiert):

    D:\projects\CTeague_Server\foo.hpp|5|error: expected constructor, destructor, or type conversion before '*' token|

    Es bezieht sich auf folgende Zeile:
    CTeague_ServerFrame* Frame;

    Vielen Dank :-))

    Hängt das vielleicht damt zusammen das die Klasse CTeague_ServerFrame Eigenschaften und so vererbt bekam?



  • mhh *push* 😞 Keine Idee?



  • Zeig mal die Umgebung der Zeile, wo der Fehler auftritt.



  • drakon schrieb:

    Zeig mal die Umgebung der Zeile, wo der Fehler auftritt.

    Ich weiss leider nicht, wie ich die Header Dateien includieren muss.

    Basisklasse:
    CTeague_ServerMain.h
    CTeague_ServerMain.cpp

    Hier wird das Frame erzeugt:
    CTeague_ServerApp.h
    CTeague_ServerApp.cpp

    Wo muss jetzt die foo.hpp includiert werden? Meine foo.hpp sieht wie folgt aus:

    #include "CTeague_ServerMain.h"
    extern CTeague_ServerFrame* Frame;
    

    Vielen Dank 🙂



  • mh, nur ein Tip würde mir reichen 😉 würde ich sofort ausprobieren. Also zu dem includen, danke 🙂



  • Zeig mal, was du genau machst (ohne den ganzen Codebalast, den du mitschleppts).

    Am besten ein Programm, welches abgesehen von diesem Fehler lauffähig wäre.



  • Also:

    foo.hpp habe ich ja bereits schon vorher geschrieben, in der CTeague_ServerMain.cpp habe ich folgende Funktion:

    int cb_on() {
       Frame->ListBox1->Append(_("Hallo12")); // der fehler
       return 0;
    }
    

    es geht im grunde ja nur draum das Frame global erreichbar zu machen.

    das frame wird ja in der CTeague_ServerApp.cpp erstellt.

    bool CTeague_ServerApp::OnInit()
    {
        //(*AppInitialize
        bool wxsOK = true;
        wxInitAllImageHandlers();
        if ( wxsOK )
        {
        	CTeague_ServerFrame* Frame = new CTeague_ServerFrame(0);
        	Frame->Show();
    
        	SetTopWindow(Frame);
        }
        //*)
        return wxsOK;
    
    }
    

    wobei ich hier die foo.hpp includiert habe (in der die deklaration mit extern steht). Das funktioniert auch ohne Fehlermeldung.

    Etwas strukturierter:
    include von foo.hpp in der CTeague_ServerApp.h

    Was muss ich jetzt in der CTeague_ServerMain.h includieren da ist das Frame ja noch nicht bekannt?



  • Wenn etwas _wirklich_ global und einzigartig verfügbar sein sollte, dann ist wohl ein Singleton eine Möglichkeit.



  • Hi, danke für deine Idee. Ich habe es mir mal angeschaut und sieht ganz interessant aus. Aber fast gleichzeitig kam mir eine Idee und zwar funktioniert mein Programm wie folgt:

    Wenn ich alles bis auf die App.cpp in die App.h rein schreibe läuft es, bei folgender Reihenfolge:
    - Main.h
    - Deklaration des Frame Pointers
    - Main.cpp

    Dann habe ich versucht genau in dieser Reihenfolge zu includen, nur dann stellt sich folgendes Problem für mich:
    Main.h (Definition des Frames)
    Main.cpp (dürfte klar sein)
    App.cpp (Ausführung des Frames und benötigt den Frame Pointer)

    So wenn ich den Pointer jetzt in der Main.h deklariere, wäre er ja in der App.cpp verfügbar, soweit so gut. Er wäre (und muss) auch in der Main.cpp verfügbar sein, wäre er ja auch, hört sich gut an. Nur dann bekomme ich wieder folgenden Fehler:

    "multiple definition of `Frame'"

    Wobei ich fast wieder am Anfang wäre.

    Müsste ich dann das Singleton in der Main.h erstellen, ja oder? Wie würde das denn aussehen? 🙂
    Danke danke ^^



  • Ehm.. Includeguards kennst du, oder?

    #pragma once
    

    An den Anfang der Header Datei stellen.

    Oder aber auch den ganzen Inhalt wie folgt wrappen:

    #ifndef MY_HEADER_NAME
    #define MY_HEADER_NAME
    
    //.. klassen usw.
    
    #endif
    

    Wobei der Name, den du für MY_HEADER_NAME so einzigartig, wie möglich sein sollte.



  • drakon schrieb:

    Ehm.. Includeguards kennst du, oder?

    #pragma once
    

    An den Anfang der Header Datei stellen.

    Oder aber auch den ganzen Inhalt wie folgt wrappen:

    #ifndef MY_HEADER_NAME
    #define MY_HEADER_NAME
    
    //.. klassen usw.
    
    #endif
    

    Wobei der Name, den du für MY_HEADER_NAME so einzigartig, wie möglich sein sollte.

    Ich bins wieder ^^ ich habe im Gefühl das wir das Problem bald gelöst haben 😉
    Ich habe diese Includeguards in den Headerdateien bereits verwenden.
    So funktioniert es auch:
    - Wenn der Inhalt der Main.cpp unter dem Inhalt der Main.h geschrieben wird, sodass keine Main.cpp mehr existiert. Mein erster Gedanke war die Main.cpp am Ende der Main.h zu includieren, was natürlich quatsch ist, weil er sonst in der .cpp nichts kennt. Jetzt nicht aufgeben 😉 Auf jedenfall schonmal ein großes Dankeschön drakon.


Anmelden zum Antworten