Với đoạn mã sau:tuyên bố thiết lập các chức năng thành viên như một người bạn bằng cách sử dụng mẫu
class A;
struct B {
static void doIt(A* pa);
};
struct C {
static void doIt(A* pa);
};
class A {
int i = 9;
// below works but requires a line per each type
friend void B::doIt(A* pa);
friend void C::doIt(A* pa);
// the below however doesn't work
// template<typename T>
// friend void T::doIt(A* pa);
// (gcc error: member 'void T::doIt(A*)' declared as friend before type 'T' defined)
// (clang just ignores the above and the error is on accessing A::i in B and C)
};
void B::doIt(A* pa) {
cout << pa->i << endl;
}
void C::doIt(A* pa) {
cout << pa->i *2 << endl;
}
int main() {
A a;
B::doIt(&a);
C::doIt(&a);
}
Có thể thay thế nhiều friend
tờ khai cho phép tất cả void T::doIt(A* pa)
phương pháp truy cập thành viên private của A
?
Cố gắng tạo nhanh B
và C
phía trên A
không giúp ích gì.
'mẫu bạn trống T :: DoIT (A * pa); 'không phải là một tuyên bố hữu ích. Trình biên dịch cần biết tên của lớp *, * function *, * class-template * hoặc * function-template * làm bạn với 'A'. 'T' không phải là tên mà nó biết và nó không thể tiến hành để làm cho mọi thành viên của' A' có thể truy cập được 'T' –
WhiZTiM
Tình bạn không bao giờ là một lựa chọn thiết kế tốt. Nó chỉ là một cách giải quyết trong một số tình huống "tuyệt vọng" ... Hãy coi đây là cơ hội để sửa đổi thiết kế của bạn. –
@ A.S.H: Không đúng. Tình bạn là một cách tuyệt vời để tăng cường đóng gói. –