Eine Klasse als Array benutzen



  • Hi,

    ich habe nun schon einige Male über die Dimensionen meines Arrays hinausgeschrieben und teils sehr miese Fehler dadurch gehabt.

    C++ bietet leider keine direkte Möglichkeit sich vor soetwas zu schützen. Daher war meine Idee um mir das Leben zu erleichtern. Ich erstelle eine Klasse myArray und überlade den [] Operator, sodass ich die Objekte wie ein Array benutzen kann. Gleichzeitig soll die Klasse bei einem Auruf von [] prüfen ob das eigentliche Array in der Klasse überhaupt groß genug für diesen Aufruf ist.

    Hier mein Ansatz:
    myArray.h

    #ifndef inc_myArray_h
    #define inc_myArray_h
    
    class myArray
    {
    	public:
    		myArray(int size);
    		~myArray();
    
    		operator [](var);
    
    	private:
    		int *_array;
    
    };
    
    #endif
    

    myArray.cpp

    #include "myArray.h"
    
    myArray::myArray(int size)
    {
    	_array = new int[size];
    }
    
    myArray::~myArray()
    {
    }
    

    test.cpp

    #include <iostream>
    
    using namespace std;
    
    #include "myArray.h"
    
    int main()
    {
    
    	myArray *a = new myArray(10);
    
    	a[0] = 10;
    
    	cout << a[0];
    
    	return 0;
    }
    

    MfG
    Scarabol



  • Wieso benutzt du nicht einfach den std::vector aus der STL ?



  • Was ist dein Problem? Was ist var? Der Datentyp für die Elementezahl sollte std::size_t sein. Außerdem würde ich einen (std::)Allocator für die Speicherverwaltung benutzen.



  • Omg, so schnell kanns gehen, std::vector kannte ich bisher noch gar nicht. Das ist genau das was ich brauche....

    Zeigt mir das laufende Programm immer an wenn ich aus dem Array hinausschreibe?

    MfG
    Scarabol



  • Für gewöhnlich kriegst du eine Fehlermeldung. Allerdings kannst du dich da nicht drauf verlassen, weil das Verhalten undefiniert ist. Es kann auch sein, dass das Programm ganz normal weiterläuft.



  • class myArray
    {
        public:
            myArray(int size){
            	_array = new int[size];
            	length = size-1;
            };
            ~myArray(){
            	delete []_array;
            };
            int &operator [](int x){
            	if(x<0){
            		cout << "underflow recovered" << endl;
            		x = 0;
            	}
            	if(x>length){
            		cout << "overflow recovered" << endl;
            		x = length;
            	}
            	return _array[x];
            };
        private:
        	int length;
            int *_array;
    
    };
    
    int main(){
      myArray a(10);
      a[0] = 1;
      a[1] = 2;
      a[2] = 3;
      a[3] = 4;
      a[10] = 4;
      a[-11] = 4;
    
      return 0;
    }
    

    habs mal so versucht

    lg lolo



  • Kann man machen, ist aber imo Unsinn.

    Was ist, wenn der Benutzer der Klasse jetzt mal keine Ausgabe auf der Konsole haben möchte, sondern z.B in ein File?



  • stimmt man sollte statt "cout" "cerr" verwenden, und eventuell bei unter bzw. überschreiten sofort mit einem exit(1); das teil beenden 😉



  • noobLolo schrieb:

    stimmt man sollte statt "cout" "cerr" verwenden, und eventuell bei unter bzw. überschreiten sofort mit einem exit(1); das teil beenden 😉

    Damit man auch sicher nicht herausfindet, wo es gekracht hat.

    Nein, ich würde std::tr1::array (bei fixen Dimensionen) oder std::vector bzw. einen der anderen Containertypen aus der STL nehmen, je nach Anforderung. Eine vernünftige Implementierung deckt fehlerhafte Arrayzugriffe mit Assertions ab. Und wenn man sich ganz sicher sein will oder auf die Idee kommt, dass Programmierfehler auch im Releasemodus weiterbestehen dürfen, kann man auf at() zurückgreifen.

    Die Container nachzuprogrammieren halte ich für eine schlechte Idee, besonders wenn nicht wichtige Dinge wie die Regel der Grossen Drei beachtet werden. Und es gibt im Normalfall keinen Grund, nicht die Standardbibliothek (oder gegebenenfalls Boost) zu verwenden. Alleine schon bis man das Iteratorkonzept vernünftig hinbringt...


Anmelden zum Antworten