Lỗi khi sử dụng Class C++

Mọi người ơi, xin giúp em với bài sau với:
Yêu cầu: Tạo một mảng số nguyên ngẫu nhiên 2 chiều MxN (với M,N nhập từ bàn phím). Tìm và in ra cực trị của mảng. Sử dụng Class.
Em đã viết đoạn code như sau nhưng không biết lỗi gì chạy không được.

#include <iostream>
#include <time.h>

class CucTri {
public:
	void khoi_tao(int m,int n){
		creat(m,n);
	}
	void xoa() {
		xoa_mang();}
	int get_max(int sophantu) {
		return find_max(sophantu);
	}
	int get_min( int sophantu) {
		return find_min(sophantu);
	}
private:
	int sophantu;
	int *Mang = new int[sophantu];
	void creat(int m, int n) {
		srand(time(0));
		for (int i = 0; i < m; i++)
		{
			for (int j = 0; j < n; j++)
			{
				Mang[n*i + j] = rand() % 100;
				if (Mang[n*i + j] <10)
				{
					std::cout << "0" << Mang[i*n + j] << " ";
				}
				else
					std::cout << Mang[i*n + j] << " ";
			}
			std::cout << std::endl;
		}
	}
	void xoa_mang() {
		delete[]Mang;
	}
	int find_max(int sophantu) {
		int max = Mang[0];
		for (int i = 0; i < sophantu; i++)
			if (max < Mang[i])
				max = Mang[i];
		return max;
	}
	int find_min( int sophantu) {
		int min = Mang[0];
		for (int i = 0; i < sophantu; i++)
			if (min > Mang[i])
				min = Mang[i];
		return min;
	}
};
int main()
{
	int n,m;
	std::cout << "Nhap so phan tu mang MxN: ";
	std::cin >> m >> n;
	
	CucTri tim_cuc_tri;
	tim_cuc_tri.khoi_tao(m, n);
	std::cout << "Gia tri lon nhat la: " << tim_cuc_tri.get_max( m*n) << std::endl;
	std::cout << "Gia tri nho nhat la: " << tim_cuc_tri.get_min( m*n) << std::endl;
	tim_cuc_tri.xoa();
	return 0;
}

hàm trong class gọi là phương thức. Nó thường được dùng với public.
thứ 2, trong hàm creat bạn chưa định nghĩa số phần tử mà mới chỉ khai báo rằng có biến sophantu vậy thôi. nên việc cấp phát là sai.

1 Like

Mình kiểm tra lại trong hàm creat không thấy có biến số phần tử bạn ơi.
Với lại sophantu mình cấp phát từ input mà bạn. Mình đang sử dụng phương pháp cấp phát động nên hoàn toàn việc cấp phát nhập từ bàn phím.

Sai ở phần int* Mang = new…;
Thứ nhất, con trỏ không được phép khởi tạo ở phần khai báo member của class
Thứ hai, khi tạo một đối tượng của class CucTri thì member sophantu chưa xác định được giá trị nên khởi tạo Mang theo sophantu là ko được
Thứ ba, không thấy có chỗ nào gán giá trị cho member sophantu cả

Giải pháp: đưa phần cấp phát cho Mang và gán giá trị cho sophantu vào hàm create hoặc hàm khoi_tao

Bạn ơi cái phần int *Mang = new ... là mình dùng để khai báo mảng toàn cục .
Nếu như mình đưa nó vào phía trong của creat hoặc khoi_tao thì chắc chắn nó sẽ báo lỗi.
Lỗi này khi chạy nó mới hiện lên thông báo và có các câu lênh break hoặc continue.
Bạn thử copy đoạn code này về chạy trên máy tính bạn xem có bị lỗi gì không?

Mình hỏi bạn, khi khai bảo biến sophantu bạn chưa gán giá trị cho nó, thì bạn tính cấp phát cho mảng bao nhiêu phần tử? nếu bạn muốn cấp phát động thì làm như này chứ sophantu = m*n rồi mới dùng toán tử new được chứ ? Chứ như code của bạn, bạn nhập m và n nhưng lại cấp phát động cho mảng bằng int *Mang = new int[sophantu]; thì sophantu bằng bao nhiêu?
Bạn để ý, sau khi bạn khởi tại đối tượng bằng dòng code CucTri tim_cuc_tri; biến sophantu và mảng int *Mang = new int[sophantu]; sẽ được tạo ra ngay, vậy sophantu bạn đã nhập chưa ?? , sau khi bạn nhập m và n, bạn gọi hàm void khoi_tao(int m,int n) nó sẽ nhảy tới hàm creat rồi thực hiện luôn, trong khi mảng đó còn chưa được cấp phát bộ nhớ nữa !! thân ~

2 Likes

Lỗi xảy ra ở phương thức xoá mảng:


Còn biến sophantu mình thấy bạn hoàn toàn không dùng đến, thậm chí bạn không hề khởi tạo, nên lúc nào nó cũng mang một giá trị rác nào đó:

Cho nên việc bạn int *Mang = new int[sophantu]; thực chất là không thể biết Mang có bao nhiêu phần tử, hàm delete[] Mang sẽ bị chặn.

Hình như bạn này chưa phân biệt được khai báo và khởi tạo.
Tách biệt 2 cái này ra, cấu trúc đúng sẽ là:

  • Khai báo trong class:
private:
	int *Mang;
  • Khởi tạo trong hàm khoi_tao:
void khoi_tao(int m,int n)
{
	Mang = new int[m * n];
	creat(m,n);
}

Bỏ luôn biến sophantu trong class đi, vì bạn có dùng đến đâu.

2 Likes

Cám ơn bạn.
Tại vì mình mới vừa học C++ và tự học nên không biết cách khai báo về mảng trong class.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?