Từ 1 tới 5 trên tổng số 5 kết quả

Đề tài: Truy cập dữ liệu lớp kế thừa từ lớp cơ sở?

  1. #1
    Ngày gia nhập
    04 2010
    Nơi ở
    Binh Thanh, Hồ Chí Minh, Vietnam, Vietnam
    Bài viết
    504

    Wink Truy cập dữ liệu lớp kế thừa từ lớp cơ sở?

    Tôi có một đoạn code như bên dưới, câu hỏi của tôi là:
    Có cách nào để lớp B có thể dùng các hàm kế thừa từ lớp A để thay đổi data của B. Hay che biến data đã được khai báo ở lớp A.
    Tks for help.
    P/s: Đang viết bài tập cho một bạn trên diễn đàn, nhưng có vẻ là chém quá tay. chưa gặp trường hợp này bao giờ.
    C++ Code:
    1. struct A_private
    2. {
    3.     int a;
    4. };
    5. class A
    6. {
    7. private:
    8.     A_private data;
    9. };
    10.  
    11. struct B_private:public A_private
    12. {
    13.     int b;
    14. };
    15. class B : public A
    16. {
    17. private:
    18.     B_private data;
    19. };
    Kết bạn với tôi <3
    Skype: giautm
    Facebook:
    https://fb.com/giautm.duongntt
    Email:
    giau.tmg@gmail.com

  2. #2
    Ngày gia nhập
    07 2010
    Nơi ở
    chỗ kín
    Bài viết
    446

    chỉ có thể dùng con trỏ thôi bạn ạ, vì lớp A ko thể biết được sự tồn tại của lớp B

    data của lớp A bạn đã đặt là private thì có lớp nào khác có thể dùng đâu mà phải che giấu

  3. #3
    Ngày gia nhập
    04 2010
    Nơi ở
    Binh Thanh, Hồ Chí Minh, Vietnam, Vietnam
    Bài viết
    504

    Trích dẫn Nguyên bản được gửi bởi pkthanh92 Xem bài viết
    chỉ có thể dùng con trỏ thôi bạn ạ, vì lớp A ko thể biết được sự tồn tại của lớp B

    data của lớp A bạn đã đặt là private thì có lớp nào khác có thể dùng đâu mà phải che giấu
    Tks, tôi cũng nghĩ chỉ có thể làm như thế.
    Góp ý phát nữa đi bác, chưa chuyển sang con trỏ, nhưng bác nghĩ là làm thế này ổn ko???
    C++ Code:
    1. unsigned int _global_iLatestID = 0;
    2. #define _K_COPY(data, field) data.field[field.copy(data.field, sizeof(data.field), 0)] = '\0'
    3. template<class T>
    4. class KFileIO
    5. {
    6. public:
    7.     KFileIO(T &data) : m_data(data) {}
    8.     ~KFileIO() {}
    9.     bool readFrom(std::istream& fInput)
    10.     {
    11.         fInput.read(reinterpret_cast<char*>(&m_data), sizeof(T));
    12.         return !fInput.fail();
    13.     }
    14.     bool writeTo(std::ostream& fOutput)
    15.     {
    16.         fOutput.write(reinterpret_cast<const char*>(&m_data), sizeof(T));
    17.         return !fOutput.fail();
    18.     }
    19. private:
    20.     T& m_data;
    21. };
    22.  
    23. struct KHuman_private
    24. {
    25.     char name[32];
    26.     char address[64];
    27.     char phone[16];
    28. };
    29. class KHuman:public KFileIO<KHuman_private>
    30. {
    31. public:
    32.     KHuman()
    33.         : KFileIO(m_data)
    34.     {}
    35.     KHuman(const std::string &name, const std::string & address, const std::string &phone)
    36.         : KFileIO(m_data)
    37.     {
    38.         _K_COPY(m_data, name);
    39.         _K_COPY(m_data, address);
    40.         _K_COPY(m_data, phone);
    41.     }
    42.     void setName(const std::string &name)
    43.     {
    44.         _K_COPY(m_data, name);
    45.     }
    46.     std::string name() const
    47.     {
    48.         return std::string(m_data.name);
    49.     }
    50.  
    51.     void setAddress(const std::string &address)
    52.     {
    53.         _K_COPY(m_data, address);
    54.     }
    55.     std::string address() const
    56.     {
    57.         return std::string(m_data.address);
    58.     }
    59.  
    60.     void setPhone(const std::string &phone)
    61.     {
    62.         _K_COPY(m_data, phone);
    63.     }
    64.     std::string phone() const
    65.     {
    66.         return std::string(m_data.phone);
    67.     }
    68. private:
    69.     KHuman_private m_data;
    70. };
    71.  
    72. struct KReader_private:public KHuman_private
    73. {
    74.     int code;
    75.     char type[32];
    76. };
    77. class KReader : public KFileIO<KReader_private>, public KHuman
    78. {
    79. public:
    80.     KReader()
    81.         : KFileIO<KReader_private>(m_data)
    82.     {
    83.         ::memset(&m_data, 0, sizeof(KReader_private));
    84.     }
    85.    
    86.     KReader(int code, const std::string& type, const std::string& name, const std::string& address, const std::string& phone)
    87.         : KFileIO<KReader_private>(m_data)
    88.     {
    89.         m_data.code = code;
    90.         _K_COPY(m_data, type);
    91.         _K_COPY(m_data, name);
    92.         _K_COPY(m_data, address);
    93.         _K_COPY(m_data, phone);
    94.     }
    95.  
    96.     void setReaderCode(unsigned int code)
    97.     {
    98.         m_data.code = code;
    99.     }
    100.     unsigned int readerCode() const
    101.     {
    102.         return m_data.code;
    103.     }
    104.  
    105.     void setReaderType(const std::string &type)
    106.     {
    107.         _K_COPY(m_data, type);
    108.     }
    109.     std::string readerType() const
    110.     {
    111.         return std::string(m_data.type);
    112.     }
    113.     using KFileIO<KReader_private>::readFrom;
    114.     using KFileIO<KReader_private>::writeTo;
    115. private:
    116.     KReader_private m_data;
    117. };
    118.  
    119. struct KBook_private
    120. {
    121.     int     id;
    122.     int     year;
    123.     char    title[32];
    124.     char    subject[32];
    125.     char    author[32];
    126. };
    127. class KBook : public KFileIO<KBook_private>
    128. {
    129. public:
    130.     KBook()
    131.         : KFileIO(m_data)
    132.     {
    133.         ::memset(&m_data, 0, sizeof(KBook_private));
    134.     }
    135.     KBook(int id, int year, const std::string &author, const std::string& subject, const std::string& title)
    136.         : KFileIO(m_data)
    137.     {
    138.         m_data.id = id;
    139.         m_data.year = year;
    140.         _K_COPY(m_data, title);
    141.         _K_COPY(m_data, author);
    142.         _K_COPY(m_data, subject);
    143.     }
    144.     void setId(int id)
    145.     {
    146.         m_data.id = id;
    147.     }
    148.     int id() const
    149.     {
    150.         return m_data.id;
    151.     }
    152.  
    153.     void setTitle(const std::string &title)
    154.     {
    155.         _K_COPY(m_data, title);
    156.     }
    157.     std::string title() const
    158.     {
    159.         return std::string(m_data.title);
    160.     }
    161.  
    162.     void setAuthor(const std::string &author)
    163.     {
    164.         _K_COPY(m_data, author);
    165.     }
    166.     std::string author() const
    167.     {
    168.         return std::string(m_data.author);
    169.     }
    170.  
    171.     void setSubject(const std::string &subject)
    172.     {
    173.         _K_COPY(m_data, subject);
    174.     }
    175.     std::string subject() const
    176.     {
    177.         return std::string(m_data.subject);
    178.     }
    179.  
    180.     void setYearOfPublication(int yearOfPublication)
    181.     {
    182.         m_data.year = yearOfPublication;
    183.     }
    184.     int yearOfPublication() const
    185.     {
    186.         return m_data.id;
    187.     }
    188.     void input()
    189.     {
    190.         std::cout << "*************************************************************" << std::endl;
    191.         std::cout << "* Enter the book information" << std::endl;
    192.         std::cout << "| Author: ";
    193.         std::cin.getline(m_data.author, sizeof(m_data.author));
    194.         std::cout << "| Subject: ";
    195.         std::cin.getline(m_data.subject, sizeof(m_data.subject));
    196.         std::cout << "| Title: ";
    197.         std::cin.getline(m_data.title, sizeof(m_data.title));
    198.         std::cout << "| Year: ";
    199.         std::cin >> m_data.year;
    200.         std::cin.ignore();
    201.         std::cout << "*************************************************************" << std::endl;
    202.         m_data.id = ++_global_iLatestID;
    203.     }
    204.     void output()
    205.     {
    206.         std::cout << "*************************************************************" << std::endl;
    207.         std::cout << "* The book information" << std::endl;
    208.         std::cout << "| Id: " << m_data.id << std::endl;
    209.         std::cout << "| Author: " << m_data.author << std::endl;
    210.         std::cout << "| Subject: " << m_data.subject << std::endl;
    211.         std::cout << "| Title: " << m_data.title << std::endl;
    212.         std::cout << "| Year: " << m_data.year << std::endl;
    213.         std::cout << "*************************************************************" << std::endl;
    214.     }
    215. private:
    216.     KBook_private m_data;
    217. };
    Kết bạn với tôi <3
    Skype: giautm
    Facebook:
    https://fb.com/giautm.duongntt
    Email:
    giau.tmg@gmail.com

  4. #4
    Ngày gia nhập
    07 2010
    Nơi ở
    chỗ kín
    Bài viết
    446

    mình chịu ko hiểu ý bạn thế nào

  5. #5
    Ngày gia nhập
    11 2010
    Bài viết
    589

    Dùng CRTP xem sao ?
    C++ Code:
    1. template<typename Derived>
    2. class A {
    3. public:
    4.     void modify() { static_cast<Derived&>(*this).modify(); }
    5. private:
    6.     A_private data;
    7. };
    8.  
    9. class B : public A<B> {
    10. public:
    11.     void modify() { data = data + 1; }
    12.     void modify_by_A() { A<B>::modify(); }
    13. private:
    14.     B_private data;
    15. };
    Đã được chỉnh sửa lần cuối bởi boss14420 : 05-05-2012 lúc 05:34 PM.

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

  1. Hàm trong C Hỏi truy câp vào trường dữ liệu
    Gửi bởi skd_nt trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 1
    Bài viết cuối: 15-07-2012, 05:37 PM
  2. Lập trình 1 website thường truy cập PC sang truy cập trong mobile
    Gửi bởi jindo872606 trong diễn đàn Thắc mắc lập trình ASP.NET
    Trả lời: 2
    Bài viết cuối: 27-03-2012, 03:33 PM
  3. Cách truy cập facebook | Nguyên tắc và các công cụ để truy cập facebook
    Gửi bởi Kevin Hoang trong diễn đàn Giải trí - Thư giãn
    Trả lời: 40
    Bài viết cuối: 14-03-2011, 10:13 AM
  4. Một câu truy vấn có thể truy vấn cả CSDL Access và DBase trong C# ko?
    Gửi bởi thuchobiet trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 4
    Bài viết cuối: 24-11-2010, 08:25 AM
  5. phân biệt "truy cập" và "truy nhập". Giúp em
    Gửi bởi Gryffindor trong diễn đàn Thắc mắc chung
    Trả lời: 6
    Bài viết cuối: 26-07-2010, 05:02 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