Como yo comenzé programando en lenguaje C, para la entrada y salida estándar prefiero usar las de la librería 
stdio. Hay muchos consejos, al final de cada capítulo, en la tercera edición del libro 
El Lenguaje de Programación C++ del creador del lenguaje C++ 
Bjarne Stroustrup, sobre evitar varias prácticas comunes que se tiene al programar en C. Por ejemplo, en C es obligatorio declarar todas las variables al abrir una llave que encierra un bloque y el autor aconseja declararlas inmediatamente antes de su uso, ya que C++ no tiene esta restricción, también aconseja usar las 
string en vez de, por ejemplo, 
char s[MAX], usar la clase 
vector en vez de arreglos, etc. Bueno, pues con respecto a usar las funciones de 
stdio, ni aconseja ni desaconseja su uso, sólo se limita a describirlas brevemente y aconseja usar la instrución 
sync_with_stdio (false); antes de usarlas, si se van a usar mezcladas con las de los flujos, para que no compartan el mismo buffer. 
Bueno, dicho lo anterior, esto es lo que haría para leer las líneas de tu archivo 
Código:
     ...
   sync_with_stdio (false); // para no mezclar en el mismo buffer e/s de <stdio> e <iostream>
                            // se debe de llamar a esta funciom antes de usar <stdio> 
    ...
   FILE* fp;
   if ((fp = fopen ("data.txt", "r") == NULL) {
      cerr << "Error al abrir el archivo data.txt" << endl";
      sc_stop();
   } else {
      fgets (line, N, fp); // lee la primera linea
       ...
       for (a1->rows++; fgets (line, N, fp) != NULL, a1->rows++) // cuenta las lineas
          ;
        ...
       fseek (fp, 0L, SEEK_SET); // vuelve apuntar al comienzo del archivo
       while (fgets (line, N, fp) != NULL) { // lee nuevamente las lineas
          ...
       }
       fclose (fp);
   }
    ...
  Es sólo una manera de resolver el problema, pero si quieres continuar usando los flujos, adelante, quizá otro lector del foro te proponga otra usando flujos.
Analizando un poco tu código, veo un poco extraño que determines el número de columnas por la longitud de la primer cadena que lees, además, si estás definiendo una clase matriz ¿no sería más lógico que le dieras las dimensiones al crear un objeto matriz pasándoselos a su constructor? En C++ puedes crear uno o varios constructores y un destructor, las cuáles se llaman implícitamente, cuando creas un objeto y cuando éste deja de existir fuera de su ámbito, ¿por qué llamar explícitamente 
a1->constructor(); y 
a1->destructor();? Al programar de esa manera desaprovechas las ventajas que te proporciona este lenguaje y por contra, puedes introducir en tu código potenciales fallas si se te olvida llamar al constructor al comenzar a usar al objeto, o al destructor cuando termina la función donde lo estés usando.