Zweidimensionalen Vektor in Klasse packen



  • Wie kann ich einen 2D Vektor in eine Klasse packen und praktisch initialisieren?

    Warum funktioniert das nicht:

    class Field
    {
    	short map1[2][2];
    public:
    	Field();
    	~Field();
    };
    
    Field::Field()
    {
    	map1[2][2] = { {1, 0}, {0, 1} };
    }
    

    😕



  • Tut mir leid, aber etwas eleganteres als

    #include <iostream>
    #include <cstring>
    
    using namespace std;
    
    class Field {
    	private:
    		short map[2][2];
    	public:
    		Field( );
    		~Field( );
    		void print( );
    };
    
    Field::Field( )
    {
    	short tmp[][2] = { { 1, 2 }, { 3, 4 } };
    	memcpy( static_cast< short[2][2] >( map ), static_cast< short[2][2] >( tmp ), sizeof( short ) * 4 );
    }
    
    Field::~Field( ) {
    }
    
    void Field::print( ) {
    	for( int y = 0; y < 2; ++y )
    		for( int x = 0; x < 2; ++x )
    			cout << "map[" << y << "][" << x << "] = " << map[y][x] << endl;
    }
    
    int main( )
    {
    	Field a;
    	a.print( );
    }
    

    fällt mir grad nicht ein. Könnt auch noch zu früh am Tag sein...

    Greetz, Swordfish



  • Hoffentlich geht das noch anders!
    Es soll eine einfache 2D Map mit der improved console werden. Entweder 1 (* wird gezeichnet) oder 0 (Leerzeichen wird gezeichnet).



  • Nope, anders geht es nicht.
    Wenn der Bildschirm am Anfang leer sein soll, initialisiere das Array mit einer Schleife mit 0, wenn Du ein bestimmtes Anfangsmuster haben willst lege dieses als statisches Array an (z.B. wie tmp im Konstruktor von Swordfish, noch als static markiert) und kopiere es bei Initialisierung. Ein (nichtstatisches) Array als Member kann nicht über die Zuweisung initialisiert werden.



  • hi..
    nur als idee nebenher..

    du könntest eine datei einlesen, sozusagen dein array im konstruktor über datei initialisieren..

    Field( ) {
    
    		ifstream ifs("data.dat");
    
    		for(int i=0; i<2; i++) {
    			for(int j=0; j<2; j++){
    				int x;
    				ifs>>x;
    				map[i][j]=x;	
    			}		
    		}
    
    	}
    

    in der datei würden, so wie hier angedeutet, die zahlen mit leerzeichen als trenner stehen.. gibts aber tausend andere varianten..



  • Ja, das sind gute Ansätze.

    Vielen Dank, ich werde mal rumprobieren.



  • Achja, wenn statische Members über Zuweisung initialisiert werden können, warum funktioniert dann das nicht:

    class Field
    {
    	static short map1[2][2];
    public:
    	Field();
    	~Field();
    };
    
    Field::Field()
    {
    	map1[2][2] = { {1, 0}, {0, 1} };
    }
    

    😕



  • Weil statische Elemente nicht im Konstruktor initialisiert werden 😉

    class Field
    {
        static short map1[2][2];
    public:
        Field();
        ~Field();
    };
    
    short Field::map1[2][2] = { {1, 0}, {0, 1} };
    Field::Field()
    {
    }
    


  • Hatte ich vergessen, tut mir leid. Vielen Dank!



  • Kann man eigentlich "clear()" von der Improved Console verschnellern?
    Ich tue es nämlich bei jedem Tastendruck und man merkt ein leichtes "Flackern".

    Und noch etwas:
    Wie frage ich die Tastatur auf eine Eingabe ab und speichere diese?

    Bitte nicht so, denn das geht 100% auf die CPU:

    #include <conio.h>
    
    int main()
    {
        while(1)
        {
            if(kbhit())
            {
                char input = getch();
                // ...
            }
        }
    }
    

    😕



  • Lieber Franzi, eine Frage pro Thread und ein Thread pro Frage!

    Mit C/C++ platformunabhängig garnicht.


Anmelden zum Antworten