Μόνο μια παρατήρηση... Για να μου δουλέψει σωστά, δηλαδή όταν δίνεις
Καλά αυτό είναι λάθος πρακτική. Στην C/C++ όταν δηλώνεις έναν πίνακα του λες πόσα στοιχεία έχει ο πίνακας και αυτά είναι αριθμημένα απο το 0 μέχρι το Ν-1, όπου Ν το πλήθος των στοιχείων του πίνακα.
πχ
int A[10];
A[0] = 1;
A[9] = 2;
A[10] = 3; // Βλακεία. Ξεπερασες τα ορια του πίνακα και κάνεις corrupt το stack.
Καλύτερα να αλλάξεις την συνάρτηση που κάνεις επικάλυψη για τον operator [] ώστε να σου επιστρέφει το i-1 στοιχείο του πίνακα. Έτσι οι κλήσεις Matrix [10] θα επιστρέφει το στοιχείο που βρίσκεται στη θέση 9 και που στην πραγματικότητα είναι το 10ο στοιχείο (αφού το πρώτο είναι στη θέση 0).
(Βέβαια στη δισδιάστατη περίπτωση, θα έχεις πρόβλημα γιατι θα έπρεπε να κανεις overload και τον global operator[](float*,int) κάτι που δεν επιτρέπεται.)
Το πιο εύκολο είναι να δηλώσεις τον πίνακά σου με 1 παραπανήσιο στοιχείο έτσι ώστε το M[1][2] να δίνει αυτό που θες (1η γραμμή, 2η στήλη παρόλο που στην πραγματικότητα θα είναι 2η γραμμή 3η στήλη).
Αυτό που ήθελα να τονίσω είναι οτι θέλει προσοχή στην προσπέλαση της μνήμης, σύμφωνα με τα όρια του πίνακα. Απο κει και πέρα κάνεις οτι θες.