Je sais que ca ne répond pas vraiment à ta question mais la 1ère méthode me semble mieux que la première. En fait j'ai de sérieux doutes dans ta 2e méthode sur ce que fait l'incrémentation d'un pointeur. De toute façon l'utilisation des crochets est aussi efficace (complexité O(1)) qu'incrémenter un pointeur mais présente en plus l'avantage d'être lisible.
Voici le code que je te propose. Soit tu mets tout dans un même fichier (par exemple main.cpp), soit tu fais un fichier main.cpp et un fichier matrix_2d.hpp (cf commentaires) :
//---- matrix_2d.hpp-----
#include <cassert>
#include <iostream>
template <typename Tdata>
class matrix_2d{
protected:
unsigned nb_row;
unsigned nb_column;
Tdata **data;
public:
matrix_2d(unsigned nb_row0,unsigned nb_column0):
nb_row(nb_row0),
nb_column(nb_column0)
{
data = new Tdata*[nb_row];
for(unsigned i=0;i<nb_row;++i) data[i] = new Tdata[nb_column];
}
inline unsigned get_nb_row() const{
return nb_row;
}
inline unsigned get_nb_column() const{
return nb_column;
}
inline const Tdata & get(unsigned row,unsigned col) const{
assert(row < nb_row);
assert(col < nb_column);
return data[row][col];
}
inline void set(unsigned row,unsigned col,const Tdata & val){
assert(row < nb_row);
assert(col < nb_column);
data[row][col] = val;
}
};
template <typename Tdata>
std::ostream & operator << (std::ostream & out,const matrix_2d<Tdata> & m){
unsigned nb_row = m.get_nb_row(),nb_col = m.get_nb_column();
for(unsigned i=0;i<nb_row;++i){
for(unsigned j=0;j<nb_col;++j){
out << m.get(i,j) << '\t';
}
out << std::endl;
}
return out;
}
//---- matrix_2d.hpp-----
//---- main.cpp ---------
// #include "matrix_2d.hpp"
// #include <iostream>
int main(){
std::cout << "Création de m:" << std::endl;
matrix_2d<int> m(5,3);
std::cout << m;
std::cout << "Initialisation de m:" << std::endl;
unsigned nb_row = m.get_nb_row(),nb_col = m.get_nb_column(),k=0;
for(unsigned i=0;i<nb_row;++i){
for(unsigned j=0;j<nb_col;++j){
m.set(i,j,k++);
}
}
std::cout << m;
return 0;
}
A l'exécution ça donne :
Création de m:
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
Initialisation de m:
0 1 2
3 4 5
6 7 8
9 10 11
12 13 14
Petites recommandations :
1) Quand tu utilises des éléments de la STl (vector, cout, endl...) pense bien à préciser le "std::" pour que ça compile avec tous les compilateurs. Si tu trouves ça lourd, rajoute en début de fichier un
using namespace std;
Attention par contre à ne pas utiliser cette instruction dans un .hpp car sinon quiconque qui utilise ce fichier hpp en sera également victime. En fait le namespace std sert à étanchéifier les noms de classe de ton programme de ceux de la STL afin d'éviter les conflits. C'est pourquoi le using namespace std doit être utilisé avec des pincettes, et uniquement dans des fichiers cpp.
2) Pense à finir ton main par un "return 0", il est sensé retourné un int (le code d'éxecution). Inutile de passer à main un argc et un argv si tu ne les utilses pas.
Bonne chance