1. 程式人生 > >【c++】=過載,報錯:沒有合適的複製建構函式

【c++】=過載,報錯:沒有合適的複製建構函式

  • 不想看太多的朋友看這句就行了:在你的複製建構函式作為引數傳進去的那個物件前加個const.
  • 是這樣的,在寫機器學習作業的時候,遇到了很多矩陣演算法,為了處理上的方便,我寫了一個矩陣類Matrix,如下:
#pragma once
#include <iostream>

class Matrix {
public:
	Matrix();

	/*
	*釋放記憶體空間
	*/
	~Matrix();

	/*
	@array:一個二維陣列
	@rows_in:array的行數
	@cols_in:array的列數
	*/
	Matrix( int rows_in, int cols_in, const float* array = NULL);

	/*
	*根據傳進來的matirx新建一個Matrix
	*/
	Matrix(Matrix& matrix);

	/*
	*設定矩陣某個位置的元素
	@row:哪一行
	@col:那一列
	@value:元素值
	*/
	void setElement(int row, int col, float value);

	/*
	*返回矩陣的列數
	*/
	int getCols()const;

	/*
	*返回矩陣的行數
	*/
	int getRows()const;

	/*
	*求矩陣的行列式
	*/
	float det();

	/*
	*求矩陣的逆
	*/
	//float* inverse();

	/*
	*過載=號
	*/
	void operator=(Matrix matrix_in);

	/*
	*過載*號
	*/
	Matrix operator*(Matrix& matrix_in);

	/*
	*重置,釋放矩陣空間
	*/
	void reset();
	/*
	@打印出矩陣
	*/
	void printMatrix();
private:
	float** elements;
	int cols;
	int rows;

	float detSub(Matrix &matrix);
};
  • 然後我實現了這裡面的函式,沒有邏輯錯誤。
  • 在我測試的時候用了下面的程式:
    在這裡插入圖片描述
  • 正如圖片所示,說沒有適當的建構函式。我各種改,改了*過載返回結果為Matrix&,我知道這樣返回出來的是一個野指標,我只是抱著僥倖的心態去試試,當然是出錯了。改到最後,沒招了。
  • 開始懷疑人生,不對,是開始懷疑自己是不是對運算子過載有誤解啊,然後上了某慕課平臺,找了某頂尖高校的c++程式設計課程來看符號過載部分內容。但是這個看只不過驗證了我對其理解沒有錯誤。不過也是有收穫的,看人家非常嚴謹,程式碼有很多const,我也學一下,畢竟這是個不錯的習慣嘛,
  • 然後就在一些應該加的地方加了一些const.
  • 改完。我隨手運行了一下,看有沒有改出毛病來。一執行,哎!,程式竟然正常運行了。真是迷啊,我到底改了啥,他怎麼就突然正常了。
  • 當然,作為一個強迫症者,肯定不會就這樣過去了,然後我又ctrl+z,回到解放前。一步一步來看,Matrix( Matrix& matrix);改成Matrix(const Matrix& matrix);,就正常了。
  • **分析下原因:**在執行完matrix2=(matrix * matrix1);這句時,matrix * matrix1結束後返回的是一個臨時物件,而這裡主函式呼叫複製建構函式Matrix( Matrix& matrix);新建一個物件來儲存運算結果,就在新建這個臨時物件的時候出問題了,因為*返回出來的物件是const的,而我這裡傳進複製建構函式的物件不是const的,所以出問題了。
  • 文章僅代表個人見解,若有錯誤,歡迎各位朋友批評指正!