Tôi có này tình hình (giản thể):độ phân giải phạm vi ngắn hơn cho các lớp lồng nhau tin
class Tree {
class Iterator {
class Stack {
// ...
}
public:
// ...
}
public:
//...
}
Tôi không muốn lộn xộn định nghĩa của lớp học và tôi quyết định viết chỉ khai báo phương thức trong lớp mình. Sau đó (waaay xuống dưới) khi tôi muốn xác định, giả sử, hãy sao chép toán tử gán như sau:
Tree::Iterator::Stack& Tree::Iterator::Stack::operator = (const Stack& p_stack) {
// ...
}
Tôi phải giải quyết các độ phân giải phạm vi khó chịu này. Tôi tự hỏi nếu có cách để rút ngắn chúng, bởi vì using
và typedef
, như tôi biết, không cung cấp cho tôi bất cứ điều gì.
EDIT: Vì đây không phải là CodeReview, và @Yulian yêu cầu làm rõ, đây là phiên bản ngắn:
Tôi đang làm cho một thực hiện Đỏ-Đen Tree lặp đi lặp lại. Được đề cập đến class Iterator
là dành cho việc di chuyển sau đơn đặt hàng (do đó, theo thứ tự cụ thể là) và class Stack
là lớp tiện ích của nó. Trong chương trình ngắn này, chỉ class Tree
sử dụng số Iterator
và chỉ Iterator
sử dụng Stack
. Sau khi lời nhắc của @ Yulian, tôi nhớ lại rằng nó sẽ hướng theo hướng đối tượng hơn nếu các lớp được đề cập được xác định riêng (có thể là mẫu), nhưng đây là một chương trình nhỏ, tự chứa và tôi đang cố gắng giữ theo cách đó.
EDIT: Tự khép kín cũng có nghĩa là đó là một chương trình tệp đơn lẻ, do đó không có tệp .h hoặc mã bên ngoài sử dụng lại bất kỳ thứ gì. Tại sao? Vì ACADEMIA (và các hạn chế tùy ý liên quan).
Tại sao 'use' và' typedef' mua cho bạn bất cứ thứ gì? – lcs
Chúng là các lớp riêng, vì vậy tôi không thể nói 'sử dụng Stack = Tree :: Iterator :: Stack;' hoặc một cái gì đó tương tự - 'Iterator' và' Stack' là không thể truy cập. –
Bạn có thể khai báo lớp lồng nhau và sau đó xác định các hàm thành viên của nó trong dòng, khi bạn định nghĩa lớp sau này. Nhưng, tôi nghĩ rằng mã đó có vẻ tốt đẹp. Nếu bạn cũng có một loạt các không gian tên để xử lý _inside_ các định nghĩa hàm, bạn thực sự có thể đặt các khai báo 'using' bên trong mỗi định nghĩa hàm. – SirGuy