J'applique ma propre classe de matrice en C++ pour m'aider à développer ma compréhension du langage. J'ai lu quelque part que si vous avez un opérateur + =, utilisez-le dans votre opérateur +. Alors, est ce que j'ai:Opérateur C++ + et opérateur + = surcharge
template <class T>
const Matrix<T>& Matrix<T>::operator+(const Matrix<T> &R){
Matrix<T> copy(*this);
return copy += R;
}
Et voici le + = surcharge de l'opérateur:
template <class T>
const Matrix<T>& Matrix<T>::operator+=(const Matrix<T> & second_matrix){
//Learn how to throw errors....
if (rows != second_matrix.getNumRows() || cols != second_matrix.getNumCols()){throw "Dimension mismatch.";}
int i,j;
for (i = 0; i < rows; i++){
for (j = 0; j < cols; j++){
data[i][j] += second_matrix.get(i,j);
}
}
return *this;
}
je peux utiliser les + = très bien (par exemple, a + = b; renvoie pas des erreurs). Mais appeler l'opérateur + (par exemple, a = b + c;) retourne:
test.cpp.out(77055) malloc: *** error for object 0x300000004: pointer being freed was not allocated
Juste pour être complet, voici mon destructor:
template <class T>
Matrix<T>::~Matrix(){
for (int i = 1; i < rows; i++){
delete[] data[i]; }
delete[] data;
}
J'utilise C++ pour quelques années et off, et ont toujours du mal à garder la trace des pointeurs. J'espère que c'est normal ... Toute aide serait géniale. Merci!
EDIT: voici mon constructeur de copie. Il a été configuré pour libérer les tableaux de données, mais j'ai supprimé cela. maintenant je reçois des fautes de segmentation.
template <class T>
Matrix<T>::Matrix(const Matrix<T>& second_matrix){
rows = second_matrix.getNumRows();
cols = second_matrix.getNumCols();
data = new T*[rows];
int i,j;
for (i = 0; i < rows; i++){
data[i] = new T[cols];
}
for (i = 0; i < rows; i++){
for (j = 0; j < cols; j++){
data[i][j] = second_matrix.get(i,j);
}
}
}
À quoi ressemble votre constructeur de copie? C'est probablement votre problème, puisque l'erreur indique que la mémoire est libérée deux fois. –
@Walt W: Oui, je soupçonne que c'est un gros problème. –
@Fred: qu'est-ce qu'un gros problème? – jakev