2012-04-20 99 views
5

Đối với bài tập về nhà của tôi, tôi phải tạo một danh sách liên kết và nó phải là một lớp mẫu. Lệnh gán cho một lớp mẫu được gọi là Danh sách và một lớp mẫu lồng nhau khác được gọi là Liên kết.Cách thiết kế các lớp mẫu lồng nhau trong đó các lớp lồng nhau cùng loại

Các phương pháp cần được xác định bên ngoài định nghĩa lớp.

Tôi đã tạo phiên bản đơn giản của bài tập trước và nó hoạt động, nhưng tôi cảm thấy có lỗi trong thiết kế của tôi.

#include <iostream> 
using namespace std; 

template <class T1> 
class A 
{ 
public: 
    template <class T2> 
    class B; 

    T1 _a; 
}; 

template <class T1> 
template <class T2> 
class A<T1>::B 
{ 
public: 
    T2 _b; 
}; 

int main() 
{ 
    A<int> a; 
    a._a = 5; 

    A<int>::B<int> b; 
    b._b = 10; 

    cout << a._a << " " << b._b << "\n"; 


    return 0; 
} 

câu hỏi chính của tôi là, kể từ khi lớp lồng nhau sẽ cùng loại, như bạn có thể nhìn thấy từ báo cáo kết quả A<int>::B<int> b;, là có một cách để có lớp B tự động được cùng loại là A? Câu hỏi của tôi thậm chí có ý nghĩa không? Nói cách khác, tôi có thể làm A<int>::B b; và b tự động cùng loại với A không? Sẽ không bao giờ có một tình huống mà tôi sẽ có A<double>::B<int>; chẳng hạn.

Trả lời

5

Có, chỉ cần tạo B không phải mẫu. T1 trong định nghĩa B vẫn đề cập đến đối số mẫu của A.

template <class T1> 
class A 
{ 
public: 
    class B; 

    T1 _a; 
} 

Bây giờ, thay vì A<int>::B<int>, đơn giản là A<int>::B.

List<int>::Link<double> sẽ không có ý nghĩa, vì vậy không có điểm nào trong đó là mẫu.

+0

OK, tôi đã suy nghĩ rằng sẽ làm việc, có phải là một vấn đề với cú pháp của tôi sau đó bởi vì tôi đã nhận được lỗi. Tôi sẽ thử nó lần nữa. –

1

Tôi không thể thấy lý do tại sao bạn cho rằng bạn cần mẫu cho lớp bên trong của mình. Bạn đã thử khai báo nó như là một lớp không phải mẫu? ví dụ.

template <class T1> 
class A 
{ 
public: 
    class B; 
private:  
    T1 _a; 
}; 

template <class T1> 
class A<T1>::B 
{ 
    T1 _b; 
}; 

(Ngoài ra, trong khi tôi nhận ra nó chỉ là một ví dụ, tôi muốn khuyên chống lại các lớp học viết với công thành viên dữ liệu)

+0

Tôi không nghĩ rằng nó là cần thiết, tôi đã chỉ làm sai lầm cú pháp tôi nghĩ bởi vì tôi không thể có được chương trình để biên dịch. Tôi đã có thể sửa lỗi từ mã mẫu của bạn. Cảm ơn! –

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