24/05/2018, 19:33

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 ...

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
    

+ 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)

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 << "
 so thi sinh: " ;
    Cin >> n;
    Ts = new ts[n+1];
    For (i=1; i<= n; ++i)
    Ts[i].nhap(i);
    Cout <<"
 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 <<"

 danh sach sau khi sap xep:";
    For (i=1; i<= n; ++i)
    Ts[i].in();
    Getch();
    }
    

Sự khác biệt giữa hàm main mới và hàm main trong mục 4 là rất ít.

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>
    #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 << "
ho ten: " << ht << " tong diem: " << td;
    }
    Int ts::nhap(int i)
    {
    Cout << "
nhap thi sinh " << i ;
    Cout << "
ho ten (bấm enter để kết thúc nhập): " ;
    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 << "
diem chuan: " ;
    Cin >> diemchuan;
    Cout <<"
danh sach trung tuyen:" ;
    P=pdau;
    While (p!=null)
    {
    If (p->gettd()>=diemchuan)
    P->in();
    P = p->getdc();
    }
    Getch();
    }
    
0