JavaBeans, и множество иных. То, что грамотная корпоративная система должна работать в минимум четырех уровнях, уже является прописной истиной: данные, бизнес-логика сервера, бизнес- логика клиента, клиент.
Понимаете теперь, в чем преимущество смарт-указателей? Они позволяют с легкостью создавать новые уровни бизнес-логик без привлечения дополнительных средств и схем, а едиными только средствами языка. Попробуйте сделать что-либо подобное на языке, который не поддерживает указателей и перегрузки операторов (да шаблоны еще)! Вот код.
#include 'ampstack.h'
class CLockable {
friend class CTransaction;
protected:
CTransaction* m_trans;
public:
CLockable (): m_trans (NULL) {}
int regObj (CTransaction* _pt);
void unregObj();
virtual ~CLockable() {}
virtual void rollback () =0;
virtual void commit() =0;
};
class CTransaction {
friend class CLockable;
private:
ampstack‹CLockable› m_locks;
void addLock (CLockable*);
public:
virtual ~CTransaction ();
void commit();
void rollback();
int allready_locked(CLockable*);
};
inline int CLockable::regObj (CTransaction* _pt) {
if (m_trans!= NULL) return 0;
else {
_pt-›addLock(this);
m_trans = _pt;
return 1;
}
}
inline void CLockable::unregObj() {
m_trans = NULL;
}
inline void CTransaction::addLock(CLockable* _lc) {
m_locks.push (_lc);
}
void CTransaction::commit() {
ampIter‹CLockable› it(&(this-›m_locks));
it.goStart();
while (!it.isLast()) it.moveNext()-›commit();
while (!m_locks.isEmpty()) m_locks.pop()-›unregObj();
}
void CTransaction::rollback() {
ampIter‹CLockable› it(&(this-›m_locks));
it.goStart();
while (!it.isLast()) it.moveNext()-›rollback();
while (!m_locks.isEmpty()) m_locks.pop()-›unregObj();
}
int CTransaction::allready_locked(CLockable* _lc) {
ampIter‹CLockable› it(&(this-›m_locks));
it.goStart();
while (!it.isLast()) if (it.moveNext() == _lc) return 1;
return 0;
}
Шаг 29 - Единственный экземпляр класса - Одиночка или Singleton.