Libray 的內容有關於公司的機密,所以不能任意讓其他人存取,
有一個方法是撰寫成 static function 供人使用,但不美觀,使用上也欠直觀,
於是將腦筋動到 friend 關鍵字上面,
我們可以創造一個存放機密資料的 class
該 class 內不能讓其他人取用的成員就設為 private
再將同一個 Library 中需要操作這些成員的類別設為 friend class
如此可以達到我方便利操作,其他廠商沒辦法取值也無法設值的效果,簡單範例如下
FriendSample.h
/***************** FriendSample.h *****************/
namespace Company
{
class Boss
{
// Boss have 2 Friend
friend class BadRD;
friend class BadSales;
private:
int m_nMoney;
};
class BadRD
{
public:
int ReturnMoney();
};
class BadSales
{
public:
int ReturnMoney();
};
}
namespace Home
{
using namespace Company;
class BadSales
{
public:
int ReturnMoney();
};
}
FriendSample.cpp
/***************** FriendSample.cpp *****************/
int Company::BadRD::ReturnMoney()
{
Boss boss;
boss.m_nMoney = 33;
return boss.m_nMoney;
}
int Company::BadSales::ReturnMoney()
{
Boss boss;
boss.m_nMoney = 66;
return boss.m_nMoney;
}
int Home::BadSales::ReturnMoney()
{
Boss boss;
//boss.m_nMoney = 99; // error C2248: 無法存取 private 成員
//return boss.m_nMoney; // error C2248: 無法存取 private 成員
return 0;
}
int main(int argc, char *argv[])
{
Company::Boss boss;
Company::BadRD badRd;
Company::BadSales badSales;
//boss.m_nMoney = 55; // error C2248: 無法存取 private 成員
cout << badRd.ReturnMoney() << endl; // echo 33;
cout << badSalesd.ReturnMoney() << endl; // echo 66;
return 0;
}
建立兩個命名空間是因為有前輩提出要求,要多想一下有沒有其他漏洞可鑽,
目前我想到的是取一個同名的 class 來操作朋友的 private 成員,
同一個 namespace 下當然無法存在兩個同名的 class 宣告,
所以使用兩個 namespace 測試看看,結果在不同 namespace 下是無法操作的(這很直觀),
方法也許很迂迴很笨,但目前只想到用 friend 來達到這種效果,未來有更好更直觀的方法再記上…
沒有留言:
張貼留言