開後門!
我們要建立一個class給別人用,假設我們有m_ID這屬性,但是是private成員,所以別人是無法存取這個屬性;有天,別人對你說我要使用這個屬性,請你做個GetID或SetID,不然乾脆點就變成public給我,但是如果你的class已經給了很多人使用,你變動了這些東西除了要compiler module一次,會很麻煩。
所以當初在設計的時候就可以做個後門讓別人使用:
class IInterface { // 使用此介面do something // 這是我們要給別人用的class }; class CCreator { private: int m_ID; // 別人想要使用這個屬性 public: friend class IInterface; CCreator() { m_ID = 100; } template<class> class PrivateAccessor; // 開個後門 };
別人要存取m_ID的話,只要在他自己的class做這些事就可以:
class CUser : public IInterface { public: CUser(CCreator &creator); }; // 存取m_ID template<> class CCreator::PrivateAccessor<CUser> { public: static int& ID(CCreator &creator) { return creator.m_ID; } }; typedef CCreator::PrivateAccessor<CUser> Accessor; CUser::CUser(CCreator &creator) { Accessor::ID(creator) = 333; // 使用 std::cout << Accessor::ID(creator) << std::endl; // 取得 }
雖然說這樣就可以存取了,但是也會造成說你擺在private根本就沒用了,其實在設計期就應該要好好思考那些要開放那些不開放了,我是覺得這樣做會後患無窮就是....