View Full Version : Tại sao có struct rồi còn sinh ra class. Lợi thế của class là gì? car0ot 21-10-2008, 11:11 PM Đúng như title , em muốn hiểu kỹ hơn sự khác biệt giữa struct và class , mong ae chỉ điểm . Em đã search trên 4rum nhưng ko thấy ! Thanks meoconlongvang 21-10-2008, 11:18 PM struct là một class đặc biệt, các thành viên của nó đều là public dieucay555 21-10-2008, 11:27 PM Quan trọng là struct thì không thể OOP như là class. Lugiavn 22-10-2008, 12:56 AM Struct là 1 loại kiểu dữ liệu có tác dụng gom các thằng kiểu dữ liệu khác vào trong 1 cục cho dễ xử. Ngôn ngữ như Java, C# toàn là đối tượng, function là method của class hết. Ko có class là ko có gì hết :D ZCoder87 22-10-2008, 07:59 AM Lâu lắm rồi mới thấy được câu hỏi hay như vầy! Class chính là Struct. Thậm chí vẫn có thể code được cả inheritance, polymorphism trên struct. (dĩ nhiên là không dùng từ khóa public của C++) Vẫn chưa có ai trả lời thuyết phục câu này cả. meoconlongvang 22-10-2008, 08:16 AM Thì class và struct đều như nhau chỉ khác là struct thì luôn public mọi thứ, class thì có thêm private, protected. tienlbhoc 22-10-2008, 08:22 AM struct nhẹ hơn class đó , nếu không yêu cầu gì nhiều thì nên dùng struct ở những chỗ không cần rờ tới class với chương trình lớn :) Lugiavn 22-10-2008, 09:03 AM Lâu lắm rồi mới thấy được câu hỏi hay như vầy! Vẫn chưa có ai trả lời thuyết phục câu này cả. Mình bảo rồi, nguyên căn struct là 1 cục gom dữ liệu thôi, mà chính xác hơn là trong C. Đến C++ thì có class và mấy cái tính năng mới như method hay inheritance, polymorphism thì struct dc thể ăn theo nên mới có những cái này. Cho nên trong C++ thì struct và class chỉ khác nhau ở chỗ như bác mèo nói là class có private, protected. http://en.wikipedia.org/wiki/C%2B%2B_structures_and_classes rox_rook 22-10-2008, 09:53 AM - Internal của STL function object đều là struct. #include <iterator> template< typename T1, typename T2 > int main() { std::transform( v.begin(), v.end(), return 0; DKhanh 22-10-2008, 10:34 AM Lâu lắm rồi mới thấy được câu hỏi hay như vầy! Class chính là Struct. Thậm chí vẫn có thể code được cả inheritance, polymorphism trên struct. (dĩ nhiên là không dùng từ khóa public của C++) Vẫn chưa có ai trả lời thuyết phục câu này cả. Vậy bạn trả lời đi. rox_rook 22-10-2008, 10:37 AM -> Đối với template, struct và class không như nhau. Lugiavn 22-10-2008, 10:44 AM - Internal của STL
function object đều là struct. Mình chưa học STL và bây giờ mới biết function object ở trên. Giả sử mình mà gặp đoạn code trên (lúc chưa biết nó là cái gì) thì chắc chắn sẽ phải nói "Hết chuyện hay sao mà xài struct ở đây hả trời?" (:#) Nói thật là đoạn code trên hoàn toàn có thể viết thành class bình thường và đáng lẽ nên viết là class. Mình ko hiểu lắm, bạn chỉ lại đoạn "có những chỗ bắt buộc dùng struct và có những chỗ bắt buộc dùng class" rõ hơn dc ko? (:-)?? rox_rook 22-10-2008, 10:47 AM Ví dụ đơn giản nhất : #include <iostream> template< struct C > int main() { Try to run it ;) ! Lugiavn 22-10-2008, 10:59 AM Ví dụ đơn giản nhất : #include <iostream> template< struct C > int main() { Try to run it ;) ! Oạch, chạy ko dc. Cái chỗ template < struct C > là sai mà. ZCoder87 22-10-2008, 11:15 AM template< typename T1, typename T2 > RR bị phạm luật rồi. Từ khóa public chỉ có ở C++ thôi. Và struct này chạy với IDE C++ chạy mới hiểu. Chứ nguyên thủy của C thì không có chuyện kế thừa như thế này. Thật ra chẳng ai dùng struct để làm 3 cái chuyện inheritance, polymorphism cả, cho nên nói struct thì ta nên hiểu là struct trong C. Class dc coi là bản nâng cấp struct. Bạn nhầm rồi đó. Một trong những công ty vẫn còn sử dụng cách lập trình C mà không dùng C++ để viết phần mềm chính là Microsoft đó. Hệ điều hành Windows chủ yếu viết bằng C vì Windows chạy sát hệ thống. Thông thường lập trình HDT thì ta vẫn dùng: C++ Languge: A *a = new A(); C Languge: Handle a = Create(); Bây giờ đa hình C++ Languge: class I{ class A:public I { class B:public I { I *a = new A(); a->Func1(); delete a; C Languge: #define CLASSA 1 Handle a = Create( CLASSA ); // Đa hình Destroy (a) Cái giá trị HWND, HANDLE... của window là đại diện. Vậy bí quyết để giải quyết vấn đề OOP in C vẫn là ở chỗ: Handle -
Cái này mấy ông Việt Nam dịch là "thẻ điều quản" -> Không hiểu nỗi ý nghĩa Vì vậy handle chỉ vị trí bộ nhớ của struct... Vậy cài đặt cái struct này như thế nào thì bạn hãy tiếp tục học đi... lên phần COM/COM+ Programing thì sẽ rõ.... lúc đó bạn làm 1 struct ở C mà các ngôn ngữ như C#, Java có thể dịch được thành class. Class ra đời nhằm đơn giản đi quá trình code này: Nhưng khi biên dịch thì nó vẫn sẽ chuyển xuống struct của C rồi thành mã máy. Và do đó dù gì đi nữa thì C++ và C vẫn là 1 (chỉ khác cách code) chứ không như C# và C++. rox_rook 22-10-2008, 11:16 AM Oạch, chạy ko dc. Cái chỗ template < struct C > là sai mà. RR bị phạm luật rồi.- r2 không hề nói về C. r2 nói về C++. Và do đó dù gì đi nữa thì C++ và C vẫn là 1 (chỉ khác cách code) chứ không như C# và C++.C++ is a subset of C ;) ! linhdeptrai 24-10-2008, 12:03 PM tôi chỉ thêm chút bổ sung zkday2686 24-10-2008, 12:36 PM đúng nhìn từ góc độ code thì có thể cói struct là class của C++. Nhưng nhìn từ góc độ thiết kế thì nó lại khác. ví dụ bạn làm một struct như sau: struct laixe nhưng khi làm qua class thì chẳng ai lại đi thiết kế 2 class laixe và nhanvien nó có các thuộc tính giống như struct cả.:) nó sẽ làm: class nhanvien class laixe:nhanvien nói chung là class nó sẽ mô tả cho một vật ngoài thế giới thực còn struct thật ra nó là một kiểu gom nhóm để giải quyết vấn đề cho nó gọn hơn thui;) Người ta đưa ra class là để cho sau này bạn có ý nâng cấp chương trình lên hay dùng lại code của project trước đó mình làm nó dễ hơn thui. rox_rook 24-10-2008, 03:40 PM - struct trong C++ không như zkday nói, nó và class là 1. ZCoder87 24-10-2008, 04:21 PM zkday hoàn toàn sai rồi! Không có gốc thì không thể có ngọn. Và nếu không có struct thì sẽ không bao giờ có class cả??? Sẵn tiện đây mình sẽ giải thích cụ thể vấn đề này luôn. Giải sử mình đang ở thập nhiên 80 (lúc đó chỉ có ngôn ngữ C) Mình sẽ code class như thế nào? struct ZTagNhanvien vftable __vfptr; Đó chính xác là 1 class đó. Vì hàm thành viên được lưu như vậy nên đây mới là nguyên tắc của sự kế thừa. Bây giờ mình sẽ định nghĩa các hàm thành viên của nó: // Nhap printf ("Nhap tuoi nhan vien: "); printf ("Nhap luong nhan vien: "); // Xuat // Constructor Constructor sẽ gán hàm thành viên vào. Dấu $$ chỉ là ký tự bình thường thôi. Nếu bạn nào biết Dump file DLL thì sẽ thấy function nó lưu dưới dạng <classname>@@?<FunctionName>... Đây là danh sách các hàm Public: typedef void* handle; Handle Create_NhanVien() // Goi Constructor return (Handle)r; void Destroy_NhanVien(Handle
h) // Public function void Xuat( Handle h ) Lúc này đối tượng được chuyển thành Handle, có nghĩa là mình đã protected các member của class lại rồi. ZCoder87 24-10-2008, 04:23 PM Hàm Main như thế này nhé: int main() // Khoi tao nhan vien Nhap(nv); // Huy nhan vien return 1; Bây giờ là kế thừa! ZTagNhanvienketoan kế thừa ZTagNhanvien struct ZTagNhanvienketoan //
Inherits // Member variable // Member function Kế thừa chính là nó chứa struct cha! Lưu ý 1 điều: Các hàm thành viên của Ketoan // Nhap thong tin nhan vien fflush( stdin ); // Xuat thong tin nhan vien printf ("Phong ban: %s", pThis->m_lpPhongban); void Nhanvienketoan$$Nhanvienketoan(ZTagNhanvienketoan* pThis) // Constructor Tiếp là public hàm khởi tạo // Contructor // Destructor Và hàm Main: int main() nvk1 = Create_NhanVienKeToan(); // Đa hình chỗ này!!! // Nhap xuat nv // Nhap xuat nvkt Destroy_NhanVienKeToan( nvkt ); zkday2686 24-10-2008, 04:40 PM
Đúng như zcoder nói các struct và con trỏ hàm nó là cơ sở để tạo nên class trong C++ và tính "Đa hình" trong nó. và nó là cái hay nhất và đẹp nhất ở C++ mà zkday từng biết. theo như zkday được biết thì các Compiler C++ nó dùng kiểu như zcoder làm để quản lý các phương thức virtual và biết lúc nào thì cần phải gọi cái phương thức của class nào. đúng là zkday có nhầm lẫn một vài vấn đề của struct bên C và bên C++ như zcoder và r2 nói. Lugiavn 24-10-2008, 04:40 PM Mình từng xài struct trong C để mô phỏng có method như class này nọ, nhưng làm luôn inheritance với polymophysm của class như trên thì quả là ghê. ZCoder87 24-10-2008, 04:41 PM Vậy tại sao đa hình. Vì trên bộ nhớ sẽ lưu đối tượng như sau:
Nhanvienketoan: Base chính là vùng data của Nhanvien Còn Nhanvien Do đó nếu ta ép kiểu void* thì nó sẽ chuyển thành Nhanvien rất dễ dàng. Không biết có ai có ý kiến gì không? Class ra đời để đơn giản quá trình code này. NamVoDang 24-10-2008, 05:26 PM Struct trong C++ đã biến thái so với C :D. vBulletin® Version 4.2.2, Copyright © 2022 vBulletin Solutions, Inc. All rights reserved. Administer by Kevin Hoang |