private成員開後門

開後門!

我們要建立一個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根本就沒用了,其實在設計期就應該要好好思考那些要開放那些不開放了,我是覺得這樣做會後患無窮就是....