C++中私有變量對外部類是不能直接訪問的,也是不能繼承的。
使用友元類可以訪問類中的私有方法、私有變量,雖然對類的封裝有一定的破壞,但是有時也是很實用的。
在實際中,在修改已有代碼時,為了不大改動已有代碼:
(1) 對於沒有繼承關系的類,如果有關聯,使用友元類還是比較方便的。
(2) 對於有繼承關系的類,如果有關聯,可以將變量訪問由private改為protected。
直接看代碼例子:
a.h
1 #include<stdio.h> 2 //注意: 該類文件中, 不要包含b.h, 否則會報錯 3 4 //注意: 由於不是同一個命名空間, 這里申明一下class B2 5 namespace st1{ 6 namespace st2{ 7 class B2; 8 } 9 } 10 11 class A{ 12 public: 13 void print(){ 14 printf("A print function\n"); 15 } 16 17 private: 18 void _inner_print(){ 19 printf("A print _inner_print\n"); 20 } 21 22 //注意: 申明友元類, 方便兩個類中可以直接訪問private變量, 函數 23 friend class B1; 24 friend class ::st1::st2::B2; 25 26 };
b.h
1 #include "a.h" 2 3 //定義B1 4 class B1{ 5 public: 6 void print(){ 7 printf("\ncall B1 print\n"); 8 a.print(); 9 a._inner_print(); 10 } 11 12 private: 13 A a; 14 }; 15 16 //定義B2 17 namespace st1{ 18 namespace st2{ 19 20 class B2{ 21 public: 22 void print(){ 23 printf("\ncall B2 print\n"); 24 a.print(); 25 a._inner_print(); 26 } 27 28 private: 29 A a; 30 }; 31 32 } 33 }
測試文件main.cpp
1 #include <stdio.h> 2 #include "b.h" 3 4 int main(){ 5 B1 b1; 6 ::st1::st2::B2 b2; 7 8 b1.print(); 9 b2.print(); 10 return 0; 11 }
輸出:
call B1 print
A print function
A print _inner_print
call B2 print
A print function
A print _inner_print