Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 7 của 7
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Copy'n'swap thì chỉ nên dùng với socket/connection thôi.

    Mình thì mình sẽ dùng 1 class chuyên về array (nhái theo std::vector), logic về array nằm hết trong này (tất nhiên bạn phải xài đc template).

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi quocchi22101262
    cảm ơn anh nhiều em sữa được rồi mà có một vấn đề nữa là khi nó delete như vậy thì nó lại không hiện ra kết quả phép tính @@ ??? không lẽ nó xóa trước khi gọi hàm xuất ???
    Copy constructor / Assignment operator của bạn đang sai. Trước tiên bạn cần check nó có phải là đang assign/copy chính nó không,
    nếu không thì cấp phát mới vùng nhớ cho List sau đó gán các giá trị.
    Sorry, còn cần kiểm tra xem vùng nhớ của List có phải là NULL ko, nếu ko thì cần giải phóng trước sau đó mới cấp phát mới.

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi quocchi22101262
    cảm ơn anh nhiều em sữa được rồi mà có một vấn đề nữa là khi nó delete như vậy thì nó lại không hiện ra kết quả phép tính @@ ??? không lẽ nó xóa trước khi gọi hàm xuất ???
    ta có thấy trong main có in ra ở chỗ nào đâu @_@

    ý là gọi c.xuat() sau khi gán c = a + b; à? Đương nhiên là ko xuất được vì mảng mà con trỏ trong c trỏ tới là mảng của (a+b), mà mảng này đã được giải phóng rồi.

    nếu ko viết assignment operator thì khi gán c = x thì nó sẽ gán c.n = x.n và c.List = x.List (cái này gọi là shallow copy). Ở đây x = a+b, là giá trị tạm thời, sau khi gán xong sẽ giải phóng x. Tức là gọi delete[] x.List, đồng nghĩa với gọi delete[] c.List vì 2 con trỏ này trỏ tới cùng 1 mảng. Như vậy c trỏ tới mảng đã được giải phóng => nếu gọi c.xuat() thì sẽ in ra giá trị rác hoặc báo lỗi.

    muốn dấu '=' nó hoạt động đúng thì phải cấp phát 1 mảng cho c.List, copy từng phần tử mà x.List trỏ tới vào mảng này.

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    Thắc mắc về hàm hủy C++

    http://codepad.org/ApJ9QuDW
    em viết như vậy khi không có hàm hủy thì chạy bình thường, còn có hàm hủy thì báo lỗi ????
    tại sao lại như vậy mấy anh???

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    do ko có overload operator=

    lúc gán c=a+b thì con trỏ trong c trỏ tới con trỏ của DaThuc (a+b) tạm thời, sau dấu ; thì (a+b) biến mất, mảng mà (a+b) tạo ra cũng bị delete[], trong khi con trỏ trong c vẫn trỏ tới. Tới khi c bị huỷ thì gây ra lỗi vì vùng nhớ này đã được giải phóng rồi.

    nếu trong hàm tạo có xài new thì ngoài hàm hủy ra còn phải overload 2 cái nữa: copy constructor và assignment operator
    copy constructor: DaThuc(const DaThuc&);
    assignment operator: const DaThuc& operator=(const DaThuc&); hoặc DaThuc& operator=(const DaThuc&);
    hoặc nếu sử dụng copy-and-swap thì const DaThuc& operator=(DaThuc); hoặc DaThuc& operator=(DaThuc);

  6. #6
    Ngày tham gia
    Sep 2015
    Đang ở
    Hà Nội
    Bài viết
    0
    Trích dẫn Gửi bởi INTP
    do ko có overload operator=

    lúc gán c=a+b thì con trỏ trong c trỏ tới con trỏ của DaThuc (a+b) tạm thời, sau dấu ; thì (a+b) biến mất, mảng mà (a+b) tạo ra cũng bị delete[], trong khi con trỏ trong c vẫn trỏ tới. Tới khi c bị huỷ thì gây ra lỗi vì vùng nhớ này đã được giải phóng rồi.

    nếu trong hàm tạo có xài new thì ngoài hàm hủy ra còn phải overload 2 cái nữa: copy constructor và assignment operator
    copy constructor: DaThuc(const DaThuc&);
    assignment operator: const DaThuc& operator=(const DaThuc&); hoặc DaThuc& operator=(const DaThuc&);
    hoặc nếu sử dụng copy-and-swap thì const DaThuc& operator=(DaThuc); hoặc DaThuc& operator=(DaThuc);
    cảm ơn anh nhiều em sữa được rồi mà có một vấn đề nữa là khi nó delete như vậy thì nó lại không hiện ra kết quả phép tính @@ ??? không lẽ nó xóa trước khi gọi hàm xuất ???

  7. #7
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi INTP
    ta có thấy trong main có in ra ở chỗ nào đâu @_@

    ý là gọi c.xuat() sau khi gán c = a + b; à? Đương nhiên là ko xuất được vì mảng mà con trỏ trong c trỏ tới là mảng của (a+b), mà mảng này đã được giải phóng rồi.

    nếu ko viết assignment operator thì khi gán c = x thì nó sẽ gán c.n = x.n và c.List = x.List (cái này gọi là shallow copy). Ở đây x = a+b, là giá trị tạm thời, sau khi gán xong sẽ giải phóng x. Tức là gọi delete[] x.List, đồng nghĩa với gọi delete[] c.List vì 2 con trỏ này trỏ tới cùng 1 mảng. Như vậy c trỏ tới mảng đã được giải phóng => nếu gọi c.xuat() thì sẽ in ra giá trị rác hoặc báo lỗi.

    muốn dấu '=' nó hoạt động đúng thì phải cấp phát 1 mảng cho c.List, copy từng phần tử mà x.List trỏ tới vào mảng này.
    à chạy được rồi cảm ơn anh chỉ giáo :v

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •