2010-02-08 20 views
10

Thông thường các thành viên/đối tượng tĩnh của một lớp giống nhau cho mỗi cá thể của lớp có thành viên/đối tượng tĩnh. Dù sao thì sao nếu đối tượng tĩnh là một phần của một lớp mẫu và cũng phụ thuộc vào đối số mẫu? Ví dụ, như thế này:C++ thành phần mẫu tĩnh, một phiên bản cho mỗi loại mẫu?

template<class T> 
class A{ 
public: 
    static myObject<T> obj; 
} 

Nếu tôi sẽ đúc một đối tượng của A như int và một số khác như float, tôi đoán sẽ có hai obj, một cho mỗi loại?

Nếu tôi tạo nhiều đối tượng A như loại int và nhiều float s, nó vẫn là hai trường hợp obj, vì tôi chỉ sử dụng hai loại khác nhau?

Trả lời

18

Thành viên tĩnh khác nhau đối với mỗi lần khởi tạo mẫu khác nhau. Điều này là do mỗi khởi tạo mẫu là một lớp khác được tạo ra bởi trình biên dịch lần đầu tiên nó gặp phải khởi tạo cụ thể của khuôn mẫu.

Thực tế là các biến thành viên tĩnh khác nhau được thể hiện bằng mã này:

#include <iostream> 

template <class T> class Foo { 
    public: 
    static int bar; 
}; 

template <class T> 
int Foo<T>::bar; 

int main(int argc, char* argv[]) { 
    Foo<int>::bar = 1; 
    Foo<char>::bar = 2; 

    std::cout << Foo<int>::bar << "," << Foo<char>::bar; 
} 

mà kết quả trong

1,2 
+0

"khác nhau"? ;) – jamesdlin

+0

Vì câu hỏi là về các thành viên tĩnh, chương trình ví dụ sẽ rõ ràng hơn nếu nó không tạo ra bất kỳ trường hợp Foo nào. Thay vì chỉ định và in ra thanh1.s, bạn có thể sử dụng Foo :: s thay thế. –

+0

@jamesdlin Ug. Đã sửa. Tôi không nên cố gắng để lật logic xung quanh trong một câu và sau đó không đọc bằng chứng đúng cách. – Yacoby

3

Có rất nhiều các biến thành viên tĩnh như có lớp và điều này áp dụng như nhau vào mẫu. Mỗi instantiation riêng biệt của một lớp mẫu chỉ tạo ra một biến thành viên tĩnh. Số lượng đối tượng của các lớp được tạo khuôn mẫu đó là không liên quan.

4

A<int>A<float> là hai loại hoàn toàn khác nhau, bạn không thể truyền giữa chúng một cách an toàn. Hai trường hợp của A<int> sẽ chia sẻ cùng một myObject tĩnh mặc dù.

+0

cảm ơn, đó là ngắn nhưng xóa tất cả mọi thứ tôi cần biết :) – user240137

1

Trong các mẫu C++ thực sự là bản sao của các lớp. Tôi nghĩ trong ví dụ của bạn sẽ có một cá thể tĩnh cho mỗi cá thể mẫu.

+1

"C++ mẫu thực sự là bản sao của lớp học": điều đó không có ý nghĩa. 0) cũng có chức năng mẫu và chức năng thành viên mẫu, 1) xác định "sao chép". Tôi đoán những gì bạn có nghĩa là mỗi lớp instantiation đại diện cho một loại lớp mới. –

+0

Có không giống như Java, C++ trong nội bộ tạo một bản sao của lớp với phần mẫu được điền vào. – Thirler

Các vấn đề liên quan