Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 17 kết quả

Đề tài: Khởi tạo mảng lớp có chứa member là mảng động

  1. #1
    Ngày gia nhập
    05 2010
    Nơi ở
    Nha Trang, Khánh Hòa
    Bài viết
    103

    Thumbs down Khởi tạo mảng lớp có chứa member là mảng động

    Vấn đề là như thế này: em có một class A gồm một mảng động x và 2 constructor (không tham số và một tham số định kích cỡ) khai báo như sau:
    C++ Code:
    1. class A{
    2. private:
    3.     int* x;
    4. public:
    5.     A(){};
    6.     A(int _length){
    7.         x=new int[_length];
    8.     }
    9.     int& operator[](int _index){
    10.         return x[_index];
    11.     }
    12. };
    có cách nào để khởi tạo một mảng của A một cách thuận tiện không ạ, em thử dùng calloc nhưng vẫn báo lỗi vi phạm bộ nhớ :(
    Ngày mai ra sao cũng chẳng biết nữa
    Mà có ra sao thì cũng chả sao

  2. #2
    Ngày gia nhập
    06 2007
    Nơi ở
    C:\WINDOWS\system32\dllcache\
    Bài viết
    3,006

    Trích dẫn Nguyên bản được gửi bởi hungphong10tin Xem bài viết
    Vấn đề là như thế này: em có một class A gồm một mảng động x và 2 constructor (không tham số và một tham số định kích cỡ) khai báo như sau:
    C++ Code:
    1. class A{
    2. private:
    3.     int* x;
    4. public:
    5.     A(){};
    6.     A(int _length){
    7.         x=new int[_length];
    8.     }
    9.     int& operator[](int _index){
    10.         return x[_index];
    11.     }
    12. };
    có cách nào để khởi tạo một mảng của A một cách thuận tiện không ạ, em thử dùng calloc nhưng vẫn báo lỗi vi phạm bộ nhớ :(

    C Code:
    1. #include <iostream>
    2. using namespace std;
    3.  
    4. class A{
    5. private:
    6.     int* x;
    7. public:
    8.     A(){}
    9.     A(int _length){
    10.         x=new int[_length];
    11.     }
    12.     int& operator[](int _index){
    13.         return x[_index];
    14.     }
    15.     ~A(){delete x;}
    16. };
    17.  
    18. void main(void)
    19. {
    20.     A *a;
    21.     a=new A[100];
    22.  
    23. }
    Ủa thấy được mà
    Đã được chỉnh sửa lần cuối bởi langman : 22-01-2013 lúc 11:34 PM.
    ^_,^

    Tổng hợp các câu chuyện hài hước vui nhộn, sử dụng Speech Synthesis để đọc : https://www.youtube.com/channel/UCLk...Tjrg/playlists


    Bùi Tấn Quang

  3. #3
    Ngày gia nhập
    11 2012
    Bài viết
    136

    Do bạn để dấu ; nên kia ko phải hàm tạo mà chỉ là prototype của hàm tạo thôi
    Anh langman cho em hỏi là: trong một số class em thấy người ta sau khi viết xong một phương thức(hàm) trực tiếp trong class cũng để dấu chấm phảy sau dấu ngoặc đóng kết thúc phương thức thì không có vấn đề gì, tại sao hàm khởi tạo constructor ở đây để thì lại chỉ coi như prototype phải chăng có sự phân biệt như vậy a?? anh giải thích giúp em được không?
    C++ Code:
    1. #include <iostream>
    2. using namespace std;
    3.  
    4. class A{
    5. private:
    6.     int* x;
    7. public:
    8.     A(){} // bỏ dấu ; thì ok cho ; vào sai
    9.     A(int _length){
    10.         x=new int[_length];
    11.     }
    12.     int& operator[](int _index){
    13.         return x[_index];
    14.     };//cho dấu chấm phảy ở đây lại ok không vấn đề gì. phải chăng có sự phân biệt gì ở đây
    15.     ~A(){delete x;}
    16. };
    17.  
    18. void main(void)
    19. {
    20.     A *a;
    21.     a=new A[100];
    22.  
    23. }
    Giao lưu và học hỏi
    https://www.facebook.com/kimcy1992

  4. #4
    Ngày gia nhập
    01 2013
    Bài viết
    1,477

    Hàm đã có cặp {} sao còn có ; vậy bạn?

  5. #5
    Ngày gia nhập
    06 2007
    Nơi ở
    C:\WINDOWS\system32\dllcache\
    Bài viết
    3,006

    A giải thích nhầm em nhé.

    đợi tí a check lại
    Đã được chỉnh sửa lần cuối bởi langman : 22-01-2013 lúc 11:35 PM.
    ^_,^

    Tổng hợp các câu chuyện hài hước vui nhộn, sử dụng Speech Synthesis để đọc : https://www.youtube.com/channel/UCLk...Tjrg/playlists


    Bùi Tấn Quang

  6. #6
    Ngày gia nhập
    11 2012
    Bài viết
    136

    Mặc định Khởi tạo mảng lớp có chứa member là mảng động

    Trích dẫn Nguyên bản được gửi bởi langman Xem bài viết
    Nó là sự kết hợp của nhiều yếu tố
    1. Hàm tạo là một trong vài hàm bắt buộc phải có trong 1 class, em ko khai báo thì nó ra mặc định

    2. em khai báo prototype ở đấy có nghĩa là em sẽ định nghĩa hàm tạo ở 1 chỗ nào đó tạm thời đến lúc built chưa có sau này viết sau!! Vì thế nên nó ko tạo ra hàm tạo mặc định nữa

    3. Không có hàm tạo thì không tạo được thực thể (đối tượng) của lớp đó

    okies?
    Vâng em anh nói vậy em hiểu rồi tại lần đầu tiên em thấy hàm tạo sau khi định nghĩa rồi lại thành chấm phảy nó lại trở thành một prototype như prototype của hàm bình thường, mà các phương thức của nó được định nghĩa trong class cho chấm phảy sau lại không là một prototype có lẽ em phải tìm hiểu lại nhiều. Cảm ơn anh.
    Giao lưu và học hỏi
    https://www.facebook.com/kimcy1992

  7. #7
    Ngày gia nhập
    06 2007
    Nơi ở
    C:\WINDOWS\system32\dllcache\
    Bài viết
    3,006

    Trích dẫn Nguyên bản được gửi bởi kimcy1992 Xem bài viết
    ..........
    Ấy a nhầm tí,
    ko để ý kĩ a cứ tưởng là
    A();



    hóa ra để ý lại câu hỏi của em nó lại là
    A(){}; << cái này có thể gây lỗi trong 1 số compiler thôi ko phải tất cả
    ở trong C++, semicolon nằm trong class để phân biệt các trường thôi
    A(int _length){
    x=new int[_length];
    };;;;;;;;;;;;;;;;; << nhiều thế này cũng chả sao mà


    P/S : chết thật, nhìn nhầm 1 tí mà đi cả sang vấn đề khác, sr kimcy92 nhé
    tiện về method, hỏi luôn,
    em có biết const nằm sau method để làm gì ko?
    ^_,^

    Tổng hợp các câu chuyện hài hước vui nhộn, sử dụng Speech Synthesis để đọc : https://www.youtube.com/channel/UCLk...Tjrg/playlists


    Bùi Tấn Quang

  8. #8
    Ngày gia nhập
    11 2012
    Bài viết
    136

    Trích dẫn Nguyên bản được gửi bởi langman Xem bài viết
    Ấy a nhầm tí,
    ko để ý kĩ a cứ tưởng là
    A();



    hóa ra để ý lại câu hỏi của em nó lại là
    A(){}; << cái này có thể gây lỗi trong 1 số compiler thôi ko phải tất cả
    ở trong C++, semicolon nằm trong class để phân biệt các trường thôi
    A(int _length){
    x=new int[_length];
    };;;;;;;;;;;;;;;;; << nhiều thế này cũng chả sao mà


    P/S : chết thật, nhìn nhầm 1 tí mà đi cả sang vấn đề khác, sr kimcy92 nhé
    tiện về method, hỏi luôn,
    em có biết const nằm sau method để làm gì ko?
    không sao anh ạ tại em test dev C thấy nó không sai nên mới hỏi kỹ lại anh thôi, em cũng nghĩ trình biên dịch nhưng chắc phải thử dùng hết mới biết cái nào lỗi.
    Theo em biết thì const sau phương thức để đảm bảo khi các đối tượng thao tác với dữ liệu thì dữ liệu của nó sẽ không thể bị thay đổi giống như là việc khai báo các tham số của hàm thông thường là một hằng thường khi truyền bằng tham chiếu hoặc con trỏ.
    Giao lưu và học hỏi
    https://www.facebook.com/kimcy1992

  9. #9
    Ngày gia nhập
    06 2007
    Nơi ở
    C:\WINDOWS\system32\dllcache\
    Bài viết
    3,006

    Trích dẫn Nguyên bản được gửi bởi kimcy1992 Xem bài viết
    không sao anh ạ tại em test dev C thấy nó không sai nên mới hỏi kỹ lại anh thôi, em cũng nghĩ trình biên dịch nhưng chắc phải thử dùng hết mới biết cái nào lỗi.
    Theo em biết thì const sau phương thức để đảm bảo khi các đối tượng thao tác với dữ liệu thì dữ liệu của nó sẽ không thể bị thay đổi giống như là việc khai báo các tham số của hàm thông thường là một hằng thường khi truyền bằng tham chiếu hoặc con trỏ.
    Hình như là .......................... em hiểu lầm ý a hỏi rồi

    ý a hỏi thế này này
    C Code:
    1. class hocsinh
    2. {
    3. public:
    4.     void ham(void) const
    5.     {
    6.     }
    7. };
    Đã được chỉnh sửa lần cuối bởi langman : 23-01-2013 lúc 12:06 AM.
    ^_,^

    Tổng hợp các câu chuyện hài hước vui nhộn, sử dụng Speech Synthesis để đọc : https://www.youtube.com/channel/UCLk...Tjrg/playlists


    Bùi Tấn Quang

  10. #10
    Ngày gia nhập
    11 2012
    Bài viết
    136

    Trích dẫn Nguyên bản được gửi bởi langman Xem bài viết
    Hình như là .......................... em hiểu lầm ý a hỏi rồi

    ý a hỏi thế này này
    C Code:
    1. class hocsinh
    2. {
    3. public:
    4.     void ham(void) const
    5.     {
    6.     }
    7. };
    thấy anh đưa ra ví dụ như thế này, chắc lúc nãy em nhầm, với ham trên thì nói chỉ có thể được gọi bởi các đối tượng là hằng số ví dụ const hocsinh HS và như như vậy nó cũng không thể làm thay đổi dữ liệu của nó khi làm việc. Hình như còn có 2 phương thức hằng mà chỉ có thể gọi các biến thành viên là hằng hoặc static thì phải nhưng với điều kiện phương thức đó phải là một phương thức hằng hoặc static, không biết có phải vậy không anh nhỉ, còn muốn thay đổi dữ liệu của một hằng đối tượng thì dữ liệu thành viên của class phải là dạng mutable
    Giao lưu và học hỏi
    https://www.facebook.com/kimcy1992

Các đề tài tương tự

  1. tại sao mà IDE không hiễn thị những Member của một đối tượng?
    Gửi bởi quanghoa trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 6
    Bài viết cuối: 12-06-2010, 10:18 PM
  2. Dành cho VIP Member and cố Mod đã có công!
    Gửi bởi Kevin Hoang trong diễn đàn Ý kiến, đề xuất và khiếu nại
    Trả lời: 23
    Bài viết cuối: 22-03-2009, 12:39 AM
  3. Biến đổi protect member trong base class thành public member trong subclass.
    Gửi bởi Kevin Hoang trong diễn đàn Thủ thuật, Tutorials và Mã nguồn C/C++/C++0x
    Trả lời: 0
    Bài viết cuối: 30-07-2006, 02:18 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn