class array global definieren



  • in der main schreibe ich :

    Map Map1;
    
    int main()
    {
    showmap(Map1);
    getinput(input1*/nicht so wichtig/*);
    runfunktion(Map1);
    }
    

    und in der map.hpp :

    void showmap(Map mapnum);
    

    und dann in der map.cpp

    void showmap(Map mapnum)
    {
    mapnum[x][y].mach dass und dass
    };
    

    aber ich weiss nicht wie ich das mit dem array regeln soll da diese variante nicht funktioniert



  • Tut mir , aber ich blicks nicht. SeppJ übernimmt das jetzt :D, und ich geh schlafen. 🤡



  • Wenn du eine eigene Klasse schreibst kannst du ohne Probleme den operator[] überladen. Aber einen operator[][], wie du ihn haben möchtest, gibt es nicht. (Vllt kann da einer von den Gurus irgendwie tricksen, aber das hilft dir nicht weiter, da du beim kleinsten Fehler wahrscheinlich schon nicht wüsstest, was wie wo nicht geht oder kaputt ist.)

    Zumal du auch eh eher einen C-lastigen Ansatz hast.
    Mach es wie out vorgeschlagen hat und überlade den operator(), dann schreibst du halt statt: map[x][y] nur map(x, y)



  • Hallo,

    2D Indexoperatoren kann man über eine Proxyklasse realisieren. Man gibt dann einfach im Indexoperator diese Proxyklasse zurück die wiederum selbst einen überladenen Indexoperatur hat.
    Erklärung z. Bsp. hier
    http://www.c-plusplus.net/forum/232303-full



  • Schon mal was von einem Proxy-Objekt gehört?

    #include <cstddef>
    
    class Map
    {
    private:
        bool data[79*23];
    
        template<typename ValT>
        class proxy
        {
        	ValT* arr;
    
        	friend class Map;
    
        	proxy( ValT* arr ):
    			arr{arr} {}
    
    	public:
    
    		ValT& operator[]( std::size_t i ) { return arr[i]; }
        };
    
    public:
    
    	Map() : data{} {}
    
        proxy<const bool> operator[]( std::size_t x ) const { return proxy<const bool>{ data + x*23 }; }
        proxy<bool>       operator[]( std::size_t x )       { return proxy<      bool>{ data + x*23 }; }
    };
    
    int main()
    {
        Map m;
    
        m[4][2] = true;
    }
    

    Edit: Verflucht seist du, Braunschwein!



  • @Sone: Warum ist das proxy-Objekt privat?


  • Mod

    typedef std::array<23, std::array<79, bool>> map;
    


  • SeppJ schrieb:

    typedef std::array<23, std::array<79, bool>> map;
    

    :p Andersum. Erst Typ, dann Size.



  • sternbein schrieb:

    @Sone: Warum ist das proxy-Objekt privat?

    Mir ist klar, dass man auch so auf den Typ zugreifen kann. Einfach so, nehme ich an.


  • Mod

    out schrieb:

    SeppJ schrieb:

    typedef std::array<23, std::array<79, bool>> map;
    

    :p Andersum. Erst Typ, dann Size.

    Ach, ich kann das nie auswendig behalten. Statisch dimensionierte Arrays benutze ich ehrlich gesagt nur sehr selten 🙂



  • SeppJ schrieb:

    out schrieb:

    SeppJ schrieb:

    typedef std::array<23, std::array<79, bool>> map;
    

    :p Andersum. Erst Typ, dann Size.

    Ach, ich kann das nie auswendig behalten. Statisch dimensionierte Arrays benutze ich ehrlich gesagt nur sehr selten 🙂

    😃 Ich finds logisch. Man fragt doch immer zuerst nach dem was , und dann nach dem wie (viele).



  • Ich habe es vorher auch verwechselt, aber man muss sich vorstellen, dass es einfach wie bei der Deklaration eines echten Arrays aussieht: Erst die Typangabe, dann die Bounds.


  • Mod

    Ja, die Analogie ist mir schon klar :p . Ich find's andersrum aber übersichtlicher, denn oft verschachtelt man die Arrays:

    array<superlange typangabe<mit vielen<verschachtelten>, templates>, wie viele>
    

    Da muss man beim Lesen viel hin und her springen, ebenso beim Schreiben. Andersrum hingegen hat man all die schnell erfassbaren Informationen auf einen Blick, danach kann man sich die dicke Typangabe ansehen. Daher mache ich es intuitiv oft falsch herum. Aber die Reihenfolge, wie sie ist, ist in der Sprache schon so tief verwurzelt, es wäre inkonsistent das in diesem Fall anders zu machen.


  • Mod

    Man kann die Umwandlung auch dem Compiler überlassen

    #include <array>
    #include <cstddef>
    
    template <typename T>
    struct identity
    {
        using type = T;
    };
    
    template <typename T>
    using eval = typename T::type;
    
    template <typename T>
    struct make_std_array
        : identity<T> {};
    
    template <typename T, std::size_t N>
    struct make_std_array<T[N]>
        : identity<std::array<eval<make_std_array<T>>,N>> {};
    
    template <typename T>
    using std_array = eval<make_std_array<T>>;
    
    #include <type_traits>
    static_assert( std::is_same<std_array<int[3][4]>, std::array<std::array<int, 4>, 3>>::value, "" );
    

    ideone



  • Nun ja, das ist ja auch nicht schwer. Ein Multidimensionales Array ist ein Array von Arrays. Und leider gibt es keine Array-Bounds als pack-expansion pattern...

    Aber camper hat immer die besten Ideen. Das ist nicht fair! 😡


Anmelden zum Antworten