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

Đề tài: [VC] Đặt code của template trong .cpp

  1. #1
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,749

    Mặc định [VC] Đặt code của template trong .cpp

    Thông thường chúng ta để code cuả template trong header file . Trong ví dụ sau , bạn có thể đặt code cuả template trong .cpp file

    PHP Code:
    //////////////////
    //  File : foo.h
    //////////////////

    // declare template

    template<class T>
    class 
    Foo
    {
    public:
       
    T x;
       
    Function(T x);
    };


    ////////////////////////////
    // File : foo.cpp
    //////////////////////////

    #include "foo.h"


    // implement template

    template<class T>
    T Foo<T>::Function(T value)
    {
       return 
    2*value;
    }

    // "create" instance Foo<int> , therefore someone can use it
    template Foo<int>;

    ///////////////////////////////////////
    // File : test.cpp  --  testing program
    ///////////////////////////////////////


    #include "foo.h"

    void main()
    {
        
    Foo<intobj;

        
    obj.Function(5);

    Sưu tầm
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

  2. #2
    Ngày gia nhập
    08 2006
    Nơi ở
    TpHCM
    Bài viết
    202

    cái gì đặt trong .cpp chả được
    đặt trong .h mới hạn chế. Tức là không phải cái gì trong .h cũng được

  3. #3
    Ngày gia nhập
    07 2006
    Bài viết
    121

    teamlate là gì vậy huynh?

  4. #4
    Ngày gia nhập
    08 2006
    Nơi ở
    TpHCM
    Bài viết
    202

    template là một khái niệm, template gần giống với tiền biên dịch (đương nhiên là không phải), việc thay thế trong template được thực hiện sau tiền biên dịch và trước quá trình biên dịch

  5. #5
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,749

    Theo Dreaminess thì:

    Template là một dạng Khuôn mẫu, nó được dùng để chứa các công thức, các văn bản(text)... cần thiết của chương trình theo một tiêu chuẩn do người lập trình đặt ra. Sử dụng Template để xây dựng lại một bản sao một cách tự động, hay dùng cho một công việc lặp đi lặp lại.
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

  6. #6
    Ngày gia nhập
    07 2006
    Bài viết
    121

    Mặc định [VC] Đặt code của template trong .cpp

    Xin lỗi nha các cậu giải thích gì mà không có ví dụ minh họa gì hết tớ thì chậm hiểu mong các bác giải thích đưa ra ví dụ nha.
    Điển hình.
    Trong C khi ta khai báo biến ta dùng cú pháp sau:

    KDL Tenbiến ;

    KDL : Kiểu dữ liệu.
    ví dụ:
    Code:
    int a; //Khai báo một biến kiểu số nguyên tên a
    Mình chỉ cần ví dụ đơn giản dể hiểu thôi chứ không cần một đoạn code dài ngoằn đâu.

  7. #7
    Ngày gia nhập
    08 2006
    Nơi ở
    TpHCM
    Bài viết
    202

    mình nghĩ vấn đề này là cơ bản, sách dạy lập trình nào chẳng có, thậm chí là tiếng Việt, bạn chịu khó tí đi, ra nhà sach mà mua lấy 1 cuốn

    đây là 1 ví dụ đơn giản về template function (1 loại template khác là template class)

    template <class T>
    void foo(T x) {T y;}

    main() {
    int x;
    char c;
    char* pch;

    foo(x);//OK
    foo(c);//OK
    foo(pch);//OK
    }

    =>như vậy ở đây có 3 hàm foo được biên dịch (đúng theo nghĩa đen), mặc dù bạn viết có 1 hàm, trong hàm foo đầu tiên T được thay thế bằng int (tương tự như chỉ thị #define T int),...

  8. #8
    Ngày gia nhập
    08 2006
    Nơi ở
    TpHCM
    Bài viết
    202

    bữa nay tui vào đây đọc lại, sực nhận ra vấn đề mà trong ví dụ của Dreaminess muốn nêu ra
    đúng ra thì cái gì đặt trong file .h được thì đặt trong file .cpp cũng được, quan trọng là có hay không thôi.

    đối với template cũng vậy, nhưng có 1 sự đặc biệt, xuất phát từ nguyên nhân là template được thay thế trước khi compile

    ta không thể viết code như thế này
    //file .h
    template <class T>
    class A {
    void foo();
    }

    //file .cpp
    template <class T>
    A<T>::foo() {...}

    //file main.cpp
    #include "a.h"
    main() {
    A<int> a;
    a.foo();
    /*lỗi không link được với A<int>::foo() vì trong a.cpp
    template <class T>
    không được thay thành <int> cho nên a.obj không có A<int>::foo()
    */
    }

    giải quyết thì rất dễ
    - giải quyết như thủ thuật trong ví dụ của Dreaminess
    //file a.cpp
    // "create" instance Foo<int> , therefore someone can use it
    template A<int>;
    nhờ dòng này template <class T> của class A đã được thay thế bằng <int>
    cho nên a.obj có A<int>::foo() và main.obj sẽ link được

    - cách truyền thống là đặt template trong .h, tức là nhập file a.cpp vào a.h


    thủ thuật của Dreaminess có một nhược điểm là
    nếu trong main() khai báo A<char>, A<short>
    thì trong a.cpp phải thêm vài dòng nữa là
    template A<char>;
    template A<short>;
    làm như vậy rất kém linh động

    tốt nhất là làm như cách truyền thống: đặt tất cả phần hiện thực của template class trong .h

    Nếu như vậy sẽ có 1 vấn đề:
    khi cần xây dựng .lib thì sao, buộc phải tách ra .h và .cpp rành mạch
    vấn đề này làm sao đây, mình vẫn không thể giải quyết được
    Có ai có kinh nghiệm về việc này không, xin chỉ giáo

  9. #9
    No Avatar
    duydq Khách

    Theo quan điểm của trình biên dịch, các mẫu không phải là các hàm hay lớp thông thường. Chúng được dịch theo nhu cầu. Điều đó có nghĩa là mã của một hàm mẫu không được dịch cho đến khi cần dùng đến. Với các trình dịch ở thời điểm thực hiện bài viết, trình dịch sẽ tạo ra từ mẫu một hàm cụ thể cho kiểu dữ liệu được yêu cầu.

    Khi các dự án phát triển lên, nó thường chi mã của một chương trình thành nhiều file khác nhau. Trong những trường hợp đó, nói chúng phần giao tiếp và phần thực hiện là tách biệt. Lấy ví dụ một thư viện hàm nào đó, phần giao tiếp thường gồm tất cả những khai báo mẫu của các hàm có thể được gọi, chúng thường được khai báo trong một "header file"với phần mở rộng .h, và phần thực hiện (phần định nghĩa cả các hàm đó) được đặt trong các file mã C++ riêng.

    Đối với mẫu, chúng ta có một điều bắt buộc khi thực hiện các dự án nhiều file: phần thực hiện (phần định nghĩa) của một lớp mẫu hay hàm mẫu phải nằm trong cùng một file với phần khai báo. Điều này có nghĩa là chúng ta không thể tách phần giao tiếp thành một file riêng mà phải gộp cả phần giao tiếp và phần thực thi vào bất kì fiel nào sử dụng mẫu.

    Trở lại với trường hợp thư viện hàm, nếu chúng ta muốn tạo một thư viện hàm mẫu, thay vì việc tạo một header file (.h) chúng ta nên tạo một "template file" chứa cả phần giao tiếp và phần thực thi của các hàm mẫu (không có một quy định nào về phần mở rộng của những file này, bạn thích dùng thế nào cũng được hoặc cứ để là .h cho tiện). Một điều cuối cùng nữa là việc một "template file" được dùng nhiều lần trong một dự án sẽ không gây ra lỗi liên kết vì chúng được dịch theo nhu cầu và những trình biên dịch hỗ trợ templates sẽ biết phải làm thế nào để không sinh mã lặp trong các trường hợp đó.

  10. #10
    Ngày gia nhập
    08 2006
    Nơi ở
    TpHCM
    Bài viết
    202

    như vậy túm lại là không thể xây dựng được lib, đúng không
    từ trước tới nay mình cứ cho là như vậy nhưng chưa dám khẳng định
    vả lại tham khảo code vài thư viện của MS cũng thấy được điều đó

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

  1. Control Login sau khi đã Convert to Template thì ở trang code không gọi đc id của tứng control ?
    Gửi bởi depzai trong diễn đàn Thắc mắc lập trình ASP.NET
    Trả lời: 1
    Bài viết cuối: 10-07-2012, 10:30 PM
  2. Làm sao để chia code class với template declaration ở một file còn definition ở một file khác?
    Gửi bởi homanhduc trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 6
    Bài viết cuối: 20-07-2011, 01:49 AM
  3. Code các hàm sắp xếp sử dụng template con trỏ hàm viết bằng C++. Giúp mình kiểm tra code
    Gửi bởi satthuvotinh trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 1
    Bài viết cuối: 16-05-2011, 12:32 PM
  4. Kỹ thuật C++ Template Method có liên quan gì đến template trong C++ ko?
    Gửi bởi ten_truycap trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 22-10-2010, 11:26 PM
  5. Cách xây dựng và sử dụng template và mảng template trong C++?
    Gửi bởi nhatnha trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 4
    Bài viết cuối: 03-08-2010, 06:24 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