Wie kann man Variablen ohne Initialisierung erstellen



  • Hallo,
    ich stehe aktuell vor einem Problem wo mir einfach der Ansatz Fehlt

    ich habe eine Variable vom Typ einer eigenen Klasse, diese bekommt im Konstruktor einen Pfad mitgegeben um eine Datenbank zu öffnen.
    nun möchte ich das die Klasse Global zur Verfügung steht.
    Aber wenn der Konstruktor aufgerufen wird, kenne ich den Pfad ja noch nicht.
    da dieser entweder erst ermittelt wird oder per Parameter beim start übergeben wird:

    kleines Beispiel

    Klasse foo("Pfad zur Datei");
    
    int main(int argc, char *argv[])
    {
          //der Pfad steckt in argv[2]
    }
    

    in z.b. Java kann man das ohne Problem machen

    Klasse foo;
    
    void main ()
    {
         foo = new Klasse("Pfad zur Datei");
    }
    

    in c++ scheint das so nicht zu gehen, wie löst man das in c++?
    mir ist schon klar, das ich die klasse anders aufbauen kann, so das man den Pfad z.b. per Setter einfach später übergibt. aber ich kann mir einfach nicht vorstellen, das C++ sowas nicht kann 🙂

    lg



  • Pointer.

    Globale Variablen? Wirklich?



  • geht in c++ 😃 🙄

    class Klassefoo
    {
    public:
        Klassefoo(std::string pfad)
        {
            pfadFoo = pfad;
        }
        ...
    private:
        std::string pfadFoo;
        ...
    };
    
    int main()
    {
        // pfad
        std::string pfad = "SowasGeht";
        Klassefoo foo(pfad);
    }
    

    hast du mit google danach gesucht?
    https://msdn.microsoft.com/de-de/library/s16xw1a8.aspx
    (erster Treffer...)

    nebenbei kenn mich zwar nicht so mit java aus aber soweit ich weiß sollte das in java genau so gehen ? 😕 😮

    class Klassefoo
    {
        Klassfoo(...)                        // java-konstruktor
        {
            ...    
        }
    }
    

    😕
    lg



  • Hi,

    globale Variablen sollten nach Möglichkeit vermieden werden. Du erzeugst damit Seiteneffekte, die mit zunehmende Komplexiität Deiner Anwendung immer weniger beherschbar werden. Irgendwann kann dann schon die kleinste Änderung Deine Anwendung unbenutzbar machen und Du weißt nicht warum.

    Falls Du aus irgendeinen Grund, der nicht in Deiner Faulheit liegt, darauf trotzdem angewiesen bist, nimm einen globalen unique Pointer.

    std::unique_ptr<Klasse> foo;
    

    VG Martin



  • Husker schrieb:

    ich habe eine Variable vom Typ einer eigenen Klasse, diese bekommt im Konstruktor einen Pfad mitgegeben um eine Datenbank zu öffnen.
    nun möchte ich das die Klasse Global zur Verfügung steht.
    Aber wenn der Konstruktor aufgerufen wird, kenne ich den Pfad ja noch nicht.

    Du nimmst einen globalen Zeiger und belegst ihn von main aus:

    Klasse *K;
    int main(int argc, char *argv[]){ K = new Klasse("Pfad ..."); }
    

    Und try ... catch nicht vergessen.



  • HeLpPeRrSs schrieb:

    geht in c++ 😃 🙄

    class Klassefoo
    {
    public:
        Klassefoo(std::string pfad)
        {
            pfadFoo = pfad;
        }
        ...
    private:
        std::string pfadFoo;
        ...
    };
     
    int main()
    {
        // pfad
        std::string pfad = "SowasGeht";
        Klassefoo foo(pfad);
    }
    

    hast du mit google danach gesucht?
    https://msdn.microsoft.com/de-de/library/s16xw1a8.aspx
    (erster Treffer...)

    nebenbei kenn mich zwar nicht so mit java aus aber soweit ich weiß sollte das in java genau so gehen ? 😕 😮

    class Klassefoo
    {
        Klassfoo(...)                        // java-konstruktor
        {
            ...    
        }
    }
    

    😕
    lg

    ja das mit dem Pointer hatte ich auch ergooglet, habe es aber leider nicht zum laufen bekommen

    std::unique_ptr<SQLiteDatabase> o;
    

    leider bekomme ich das nicht zum laufen,
    schon bei der Definition bekomme ich von Eclipse folgende Fehler:
    `

    ‘unique_ptr’ in namespace ‘std’ does not name a template type

    `

    und natürlich habe ich versucht den Fehler zu Googlen,
    aber eine lösung habe ich nicht gefunden
    z.b. das hier:
    http://stackoverflow.com/questions/30854766/cant-compile-c11-source-using-gcc-5-1-toolchain

    und wie es in java geht hatte ich ja oben geschrieben 🙂



  • zufallswert schrieb:

    Husker schrieb:

    ich habe eine Variable vom Typ einer eigenen Klasse, diese bekommt im Konstruktor einen Pfad mitgegeben um eine Datenbank zu öffnen.
    nun möchte ich das die Klasse Global zur Verfügung steht.
    Aber wenn der Konstruktor aufgerufen wird, kenne ich den Pfad ja noch nicht.

    Du nimmst einen globalen Zeiger und belegst ihn von main aus:

    Klasse *K;
    int main(int argc, char *argv[]){ K = new Klasse("Pfad ..."); }
    

    Und try ... catch nicht vergessen.

    Jup das hat geklappt,
    also globale Pointer sind OK,
    globale Variablen sollte ich vermeiden, habe ich verstanden
    Danke !



  • Husker schrieb:

    also globale Pointer sind OK,

    Nein! Pointervariablen sind Variablen.



  • manni66 schrieb:

    Husker schrieb:

    also globale Pointer sind OK,

    Nein! Pointervariablen sind Variablen.

    okay wie denn dann,
    die Object immer wieder neu erzeugen wenn man sie benötigt ?
    bei der Datenbank klasse, könnte man das sicher machen, vielleicht sogar sauberer wenn sie immer wieder weggräumt wird, wenn sie nicht benötigt wird.

    aber wie geht man den mit werten wie. z.b. dem Pfad zur datenbank um,
    immer wieder aus na Config lesen ?
    irgendwo muss man die doch zwischenspeichern oder reicht man die Object durch?

    ich gebe ja zu das meine C++ Kenntnisse aktuell noch sehr bescheiden sind,
    aber c++ ist nun auch nicht die leichteste Sprache 🙂

    aber ich meine irgendwo muss man doch ein paar sachen Speichern die man für den Programmablauf benötigt?!?!



  • Husker schrieb:

    ... oder reicht man die Object durch?

    Das ist die sauberste Lösung, weil die Abhängigkeiten bereits im ctor ersichtlich sind.



  • Ich habe jetzt schon eine halbe Ewigkeit nicht mehr in Java programmiert, aber ich bin mir sicher, dass man da auch, soweit wie möglich, auf globale Variablen verzichtet. Wie machst du das denn da?



  • Schlangenmensch schrieb:

    Ich habe jetzt schon eine halbe Ewigkeit nicht mehr in Java programmiert, aber ich bin mir sicher, dass man da auch, soweit wie möglich, auf globale Variablen verzichtet. Wie machst du das denn da?

    klar Reicht man in JAVA objecte auch durch,
    aber Variablen im GLobalen bereich einer Klasse zu halten stellt dort kein Problem da, ist gang und gebe, und habe auch noch nie gehört das das zu problemen geführt hat.

    wird mit Datenbank Klassen Rel. häufig gemacht,
    oder z.b. mit Settings ...

    aber okay, wenn das in c++ verpönt ist oder zu Problemen führen kann, dann baue ich das um Deklariere das in der Main und Reiche es an die Funktionen durch
    ich gehe aber mal davon aus das ich dann nur Pointer weitergebe oder ?



  • Genau, du gibst Referenzen an Objekte weiter, die es brauchen.



  • Willst du ein Singleton? Das ist dass, wodran ich bei dem Stichwort Datenbank Klasse irgendwie denken muss.
    Vieleicht ist "static" das was du suchst und dir hilft die Diskussion hier (Singleton vs. 'Static Class') weiter.



  • Husker schrieb:

    HeLpPeRrSs schrieb:

    geht in c++ 😃 🙄

    class Klassefoo
    {
    public:
        Klassefoo(std::string pfad)
        {
            pfadFoo = pfad;
        }
        ...
    private:
        std::string pfadFoo;
        ...
    };
     
    int main()
    {
        // pfad
        std::string pfad = "SowasGeht";
        Klassefoo foo(pfad);
    }
    

    hast du mit google danach gesucht?
    https://msdn.microsoft.com/de-de/library/s16xw1a8.aspx
    (erster Treffer...)

    nebenbei kenn mich zwar nicht so mit java aus aber soweit ich weiß sollte das in java genau so gehen ? 😕 😮

    class Klassefoo
    {
        Klassfoo(...)                        // java-konstruktor
        {
            ...    
        }
    }
    

    😕
    lg

    ja das mit dem Pointer hatte ich auch ergooglet, habe es aber leider nicht zum laufen bekommen

    😕
    habe nix von pointern geschrieben?

    in dem link geht es um KONSTRUKTOREN !!

    du kannst das in c++ machen wie in java ...
    schau es dir doch an... (siehe mein beispiel und LIES es mal!!)



  • Schlangenmensch schrieb:

    Willst du ein Singleton? Das ist dass, wodran ich bei dem Stichwort Datenbank Klasse irgendwie denken muss.
    Vieleicht ist "static" das was du suchst und dir hilft die Diskussion hier (Singleton vs. 'Static Class') weiter.



  • Mist - Text weg 😡

    Nein, er will kein Singleton.

    Ein Singleton sorgt dafür, dass es nur eine Instanz einer Klasse gibt und ist nicht der schöner klingende Ersatz für eine globale Variable.



  • Ich hatte mich schon über das Zitat ohne Text gewundert.

    Mir ist durchaus klar, was ein Singleton ist, aber aufgrund der Problembeschreibung hatte ich das Gefühl, dass es bessere Designmöglichkeiten als Globale Variablen gibt, bzw. bin mir nicht mal mehr sicher ob er wirklich globale Variablen meint, wenn von

    Husker schrieb:

    Variablen im GLobalen bereich einer Klasse

    die Rede ist.


Anmelden zum Antworten