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
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
Sưu tầmPHP Code://////////////////
// File : foo.h
//////////////////
// declare template
template<class T>
class Foo
{
public:
T x;
T 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<int> obj;
obj.Function(5);
}
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 đó.Email: kevin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
Phone: 0972 89 7667
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 hoặc bị sự thiếu kỷ luật làm tiêu tan sự nghiệp.
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
teamlate là gì vậy huynh?
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
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.
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 đó.Email: kevin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
Phone: 0972 89 7667
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 hoặc bị sự thiếu kỷ luật làm tiêu tan sự nghiệp.
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ụ:
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.Code:int a; //Khai báo một biến kiểu số nguyên tên a
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),...
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
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 đó.
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 đó