Non mi pare di aver visto nel codice da te postato la sezione per il riempimento di Casella, e al tuo codice mi sono attenuto.
ma poi scusa è necessario dare un size al vector dal momento che il loro size puo variare di volta in volta?
La size la stai passando tu nel costruttore di tabella (int n). Che poi tu faccia:
codice:
/*Crea Tabella di Default a 0*/
Tabella::Tabella(int n)
{   
    tabella->resize(n); 
    for (int i = 0; i < n; i++)
    {
        //for (int j = 0; j < n; j++)
        //{
            Casella *casella = new Casella(); //Il Costruttore di Default di Casella, genera numero=0 e fisso=false
            tabella->at(i).push_back(casella); //sull'i-esimo vettore di vettore inseriamo in coda una Casella di valore 0
        //}
    }
};

// oppure

/*Crea Tabella di Default a 0*/
Tabella::Tabella(int n)
{   
    for (int i = 0; i < n; i++)
    {
        tabella->push_back(); 
        //for (int j = 0; j < n; j++)
        //{
            Casella *casella = new Casella(); //Il Costruttore di Default di Casella, genera numero=0 e fisso=false
            tabella->at(i).push_back(casella); //sull'i-esimo vettore di vettore inseriamo in coda una Casella di valore 0
        //}
    }
};
non cambia la sostanza: devi creare lo spazio per mettere gli elementi. E lo spazio è sempre n
P.S. il mio professore vuole che gli oggetti vengano istanziati dinamicamente con new;
Capisco. Diciamo che fa "strano" vedere allocare un vector, ma se le consegne sono queste non le discuto. Attento però che solo per chi fai una new devi far corrispondere una delete. Oltretutto le delete seguono un preciso ordine.
codice:
    delete &this->n; // errore: n non è un puntatore!!
    delete tabella;  // ok, ma al posto sbagliato.
    tabella->clear(); // ok, ma al posto sbagliato
corretto è:
codice:
    tabella->clear(); // ok, ma inutile. Ci pensa delete tabella a pulire tutto.
    delete tabella;
Lo stesso nel distruttore di Casella: numero e fisso NON sono puntatori. Niente delete.