Ähm, schaut mal



  • hi, gibt es eine möglichkeit dass mir eine funktion eine variable erschafft, welche nach der funktion noch verfügbar ist?

    in der art

    void foo()
    {
    int i = 15
    }

    und nach der funktion ist i noch verfügbar?

    was ich NICHT benötige ist ein rückgabewert, auch keine manipulation über referenz oder zeiger von existenten variablen, noch soll i bereits deklariert sein,

    die funktion soll mir i ERSTELLEN,

    ich glaube zwar nicht dass das so einfach geht aber möglichkeiten werden gern gesehn^^



  • So:

    void foo()
    {
    public:
    int i = 15
    }
    

    😉



  • ok, wenn ich folgendes in code::blocks eingebe:

    #include <iostream>
    
    using namespace std;
    
    void foo()
    {
        public:
        int i = 12;
    }
    int main()
    {
        int i;
        i = 15;
        cout << "vor foo: " << i << endl;
        foo();
        cout << "nach foo: " << i << endl;
        return 0;
    }
    

    gibts folgendes:

    C:\Programme\CodeBlocks\MEINS\test\main.cpp||In function void foo()':| C:\\Programme\\CodeBlocks\\MEINS\\test\\main.cpp|7|error: expected primary-expression before "public"| C:\\Programme\\CodeBlocks\\MEINS\\test\\main.cpp|7|error: expected;' before "public"|
    ||=== Build finished: 2 errors, 0 warnings ===|



  • Das wird nicht funktionieren. Du könntest das aber mit einem this-Zeiger lösen. Hier ein Link: http://tutorial.schornboeck.net/this.htm . 🙂



  • Es geht nicht. Die Variable ist nur innerhalb der Funktion sichtbar. Das hinter der Variable liegende Objekt (das u.U. auch außerhalb der Funktion noch existiert) scheint dich ja nicht zu interessieren, sondern wirklich die Variable an sich.

    Ist das eine reine Neugierfrage oder hast du irgendwas bestimmtes vor?



  • nunja, was bestimmtes eig schon:

    ich möchte mir funktionen schaffen die mir das erstellen von fenstern und allen möglichen objekten erleichtern

    zB in einem spiel möchte ich statt Window x(auflösung, name, stil,...)
    nur noch CreateWindow() aufrufen können, natürlich muss das fenster danach noch existieren ...
    dachte schon darüber nach eine klasse spiel zu schreiben in dem ein Window bestandteil ist, allerdings müsste ich das dann eig protected deklarieren und dann eine funktion Window& GetWindow() oder so schreiben, und spätere aufrufe wie spiel.getwindow().resize() sind halt net besonders gut zu lesen denk ich, da wär es mir recht eine funktion erzeugt mir des ;

    hmm welche "professionellen" alternativen hab ich denn?



  • Naja ganz grundsätzlich als Rückgabewert einer Funktion

    Window createWindow() {
      Window w = ...
      bla
    
      return w;
    }
    
    int main() {
      Window w = createWindow();
      w.resize(blub);
    }
    

    Nur mal die Grundidee ... Windows werden wohl meistens als Zeiger rumgereicht. Es geht hier nur darum, dass du ja eigentlich nicht die Variable erzeugen willst, sondern ein Objekt. Wenn man das ganze noch weiter treibt stößt man irgendwann auf das Factory Pattern.



  • Window w = createWindow();

    eben solch eine zeile wollt ich mir sparen; aber ich denke dass ich wohl nicht drum herum komme 🙂



  • Was ist an der Zeile schlimmer als an createWindow(); ? (Außer 10 Zeichen zusätzlich...)

    Naja also wenns unbedingt sein muss kannst du Variablen mit einem Makro erzeugen. Bei deinem Allerwelts-Anwendungsfall würde ich das aber nicht machen.



  • Du kannst dir eine eigene kleine Mini-Engine bzw. ein Mini-Framework basteln, welches "benannte Objekte" verwalten kann.
    Dann hättest du z.B. eine "Game" Klasse, die ein Container von Objekten (u.U. verschiedenen Typs) ist.
    Die "Game" Klasse kann dann ohne Weiteres eine Funktion "CreateWindow" haben, die ein Fenster als "benanntes Objekt" erstellt. Die "benannten Objekte" speichert die "Game" Klasse dann z.B. in einer map/unordered_map. Zugriff auf die Objekte kannste du dann via Lookup-Funktionen ("GetWindow" oder einfach "GetObject") machen.
    Ob das dann angenehmer zu Programmieren ist ist natürlich die Frage.

    Natürlich gibt es auch fertige Engines die ähnliche Funktionen implementieren.


Anmelden zum Antworten