01/10/2018, 11:00
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;
}
Bài liên quan
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ạnchưa định nghĩa số phần tử
mà mới chỉkhai báo
rằng có biếnsophantu
vậy thôi. nên việc cấp phát là sai.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áomảng toàn cục
.Nếu như mình đưa nó vào phía trong của
creat
hoặckhoi_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ặccontinue
.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ằngint *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ếnsophantu
và mảngint *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àmvoid khoi_tao(int m,int n)
nó sẽ nhảy tới hàmcreat
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 ~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ếtMang
có bao nhiêu phần tử, hàmdelete[] 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à:
khoi_tao
:Bỏ luôn biến
sophantu
trong class đi, vì bạn có dùng đến đâu.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.