Tải bản đầy đủ (.docx) (5 trang)

cấp phát bộ nhớ cho đối tượng

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (51.31 KB, 5 trang )

cấp phát bộ nhớ cho đối tượng
11.1. Cách cấp phát bộ nhớ cho đối tượng
Có thể dùng new và tên lớp để cấp phát một vùng nhớ cho một hoặc một dẫy các đối
tượng. Bộ nhớ cấp phát được quản lý bởi một con trỏ kiểu đối tượng. Ví dụ sau khi đó định
nghĩa lớp DIEM như trong mục trên, ta có thể thực hiện các lệnh cấp phát bộ nhớ như sau:
int n = 10;
DIEM *p, *q, *r ;
p = new DIEM ; // Cấp phát bộ nhớ cho một đối tượng
q = new DIEM[n] ; //Cấp phát bộ nhớ cho n đối tượng
r = new DIEM(200,100); // Cấp phát bộ nhớ và khởi gán cho
// một đối tượng
11.2. Làm việc với đối tượng thông qua con trỏ
+ Giả sử con trỏ p trỏ tới vùng nhớ của một đối tượng nào đó. Khi đó:
- Để biểu thị một thành phần (thuộc tính hoặc phương thức) của đối tượng, ta dùng
mẫu viết sau:
p -> tên_thành_phần
- Để biểu thị đối tượng, ta dùng mẫu viết sau:
*p
+ Giả sử con trỏ q trỏ tới địa chỉ đầu vùng nhớ của một dẫy đối tượng. Khi đó:
- Để biểu thị một thành phần (thuộc tính hoặc phương thức) của đối tượng thứ i, ta
dùng một trong các mẫu viết sau:
q[i].tên_thành_phần
(q+i)-> tên_thành_phần
- Để biểu thị đối tượng thứ i, ta dùng một trong các mẫu viết sau:
q[i]
*(q+i)
11.3. Bài toán sắp xếp thí sinh
Trong mục 10.4. đó sử dụng mảng đối tượng để giải quyết bài toán: Nhập một danh sách
thí sinh, sắp xếp danh sách theo thứ tự giảm của tổng điểm. Dưới đây sẽ đưa ra phương án
mới bằng cách dùng con trỏ và cấp phát bộ nhớ cho các đối tượng. Chương trỡnh chỉ thay
đổi hàm main() như sau:


void main()
{
TS *ts;
int n, i, j;
clrscr();
cout << "\n So thi sinh: " ;
cin >> n;
ts = new TS[n+1];
for (i=1; i<= n; ++i)
ts[i].nhap(i);
cout <<"\n Danh sach nhap vao:";
for (i=1; i<= n; ++i)
ts[i].in();
for (i=1; i<n ; ++i)
for (j=i+1 ; j<=n; ++j)
if (ts[i].gettd() < ts[j].gettd())
ts[i].hv(ts[j]);
cout <<"\n\n Danh sach sau khi sap xep:";
for (i=1; i<= n; ++i)
ts[i].in();
getch();
}
Nhận xét: Sự khác biệt giữa hàm main mới và hàm main trong 10.4 là rất ít.
11.4. Danh sách móc nối
Chương trỡnh dưới đây định nghĩa lớp tự trỏ TS (lớp có thuộc tính kiểu *TS). Lớp này
được dùng để tổ chức danh sách móc nối. Chương trỡnh nhập một danh sỏch thớ sinh và
chứa trong một danh sỏch móc nối. Sau đó duyệt trên danh sách này để in các thí sinh trúng
tuyển. So với lớp TS nêu trong mục 10.4, lớp TS ở đây có một số điểm khác như sau:
+ Thêm thuộc tính:
TS *dc; // Dùng để chứa địa chỉ của một đối tượng kiểu TS

+ Thêm các phương thức:
void setdc(TS *dc1) ; // Gán dc1 cho thuộc tính dc
TS *getdc() ; // Nhận giá trị của dc
+ Phương thức nhap trong chương trỡnh trước có kiểu void nay sửa là:
int nhap(int i);
Phương thức trả về 1 nếu họ tên nhập vào khác trống, trả về 0 nếu trái lại.
+ Bỏ đi các phương thức không dùng đến như: Toán tử gán, hoán vị.
//CT4_16.CPP
// Danh sách móc nối
// Lop TS (thi sinh)
#include <conio.h>
#include <iostream.h>
#include <string.h>
#include <ctype.h>
220
#include <stdio.h>
class TS
{
private:
char *ht;
double td;
TS *dc;
public:
TS()
{
ht = new char[20];
td = 0;
dc=NULL;
}
~TS()

{
delete ht; dc=NULL ;
}
int nhap(int i);
void in();
double gettd()
{
return td;
}
void setdc(TS *dc1)
{
dc=dc1;
}
TS *getdc()
{
return dc;
}
} ;
void TS::in()
{
cout << "\nHo ten: " << ht << " Tong diem: " << td;
}
int TS::nhap(int i)
{
cout << "\nNhap thi sinh " << i ;
cout << "\nHo ten (Bấm Enter để kết thúc nhập): " ;
222
fflush(stdin);
gets(ht);
if (ht[0]==0) return 0;

cout << "Tong diem: " ; cin >> td;
dc=NULL;
return 1;
}
void main()
{
int i=0;
TS *pdau,*p,*q;
pdau=NULL;
clrscr();
while(1)
{
q=new TS;
++i;
if (q->nhap(i)==0)
{
delete q; break;
}
if (pdau==NULL)
pdau = p = q;
else
{
p->setdc(q) ;
p = q;
}
}
/* In */
double diemchuan;
cout << "\nDiem chuan: " ;
cin >> diemchuan;

cout <<"\nDanh sach trung tuyen:" ;
p=pdau;
while (p!=NULL)
{
if (p->gettd()>=diemchuan)
p->in();
p = p->getdc();
}
getch();
}

×