ΠΠΌΠ΅Ρ ΡΠ°ΠΊΡΡ ΠΈΠ΅ΡΠ°ΡΡ ΠΈΡ ΡΠΈΠΏΠΎΠ², ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΌΠΎΠΆΠ΅Ρ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ Π·Π°ΠΏΡΠΎΡΠΈΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΎ Π΄Π°Π½Π½ΠΎΠΌ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ Π½Π΅ Π·Π°Π²ΠΈΡΡΡΠ΅ΠΉ ΠΎΡ ΡΡΠ°Π½ΡΠ»ΡΡΠΎΡΠ° ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ:
bool SaveString(IFastString *pfs, const char *pszFN) { boot bResult = false; IPersistentObject *ppo = (IPersistentObject) pfs->Dynamic_Cast(Β«IPers1stentObjectΒ»); if (ppo) bResult = ppo->Save(pszFN); return bResult; }
Π ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠΈΡΡΡΡΡΠ²ΡΡΡ ΡΡΠ΅Π±ΡΠ΅ΠΌΠ°Ρ ΡΠ΅ΠΌΠ°Π½ΡΠΈΠΊΠ° ΠΈ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΠΈΠΏΠ°, Π½ΠΎ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΊΠ»Π°ΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΠ΅ Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ°ΠΌΠΎΠ»ΠΈΡΠ½ΠΎ:
class FastString : public IFastString, public IPersistentObject
{
int m_cΡh;
// count of characters
// ΡΡΠ΅ΡΡΠΈΠΊ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ²
char *m_psz;
public:
FastString(const char *psz);
~FastString(void);
// IExtensibleObject methods
// ΠΌΠ΅ΡΠΎΠ΄Ρ IExtensibleObject
void *Dynamic_Cast(const char *pszType);
void Delete(void);
// deletes this instance
// ΡΠ΄Π°Π»ΡΠ΅Ρ ΡΡΠΎΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ
// IFastString methods
// ΠΌΠ΅ΡΠΎΠ΄Ρ IFastString
int Length(void) const;
// returns # of characters
// Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΈΡΠ»ΠΎ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ²
int Find(const char *psz) const;
// returns offset
// Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅
// IPersistentObject methods
// ΠΌΠ΅ΡΠΎΠ΄Ρ IPersistentObject
bool Load(const char *pszFileName);
bool Save(const char *pszFileName);
};
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Dynamic_Cast Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠΌΠΈΡΠΈΡΠΎΠ²Π°ΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ RTTI ΠΏΡΡΠ΅ΠΌ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΈΠ΅ΡΠ°ΡΡ ΠΈΠ΅ΠΉ ΡΠΈΠΏΠΎΠ² ΠΎΠ±ΡΠ΅ΠΊΡΠ°. Π ΠΈΡΡΠ½ΠΎΠΊ 1.8 ΠΈΠ»Π»ΡΡΡΡΠΈΡΡΠ΅Ρ ΠΈΠ΅ΡΠ°ΡΡ ΠΈΡ ΡΠΈΠΏΠΎΠ² Π΄Π»Ρ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ° FastString. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΊΠ»Π°ΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠΎΡΠΎΠΆΠ΄Π°Π΅ΡΡΡ ΠΈΠ· ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠ½ Π²ΡΡΡΠ°Π²Π»ΡΠ΅Ρ, ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Dynamic_Cast Π² FastString ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΎΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ²Π½ΡΠ΅ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΡ ΡΠΈΠΏΠ° (explicit static casts), ΡΡΠΎΠ±Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΡΡ ΠΎΠ±Π»Π°ΡΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ this, ΠΎΡΠ½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π½Π° ΠΏΠΎΠ΄ΡΠΈΠΏΠ΅, ΠΊΠΎΡΠΎΡΡΠΉ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π΅ΡΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ:
void *FastString::Dynam1c_Cast(const char *pszType)
{
if (strcmp(pszType, Β«IFastStringΒ») == 0) return static_cast<IFastString*>(this);
else if (strcmp(pszType, Β«IPersistentObjectΒ») == 0) return static_cast<IPersistentObject*>(this);
else if (strcmp(pszType, Β«IExtensibleObjectΒ») == 0) return static_cast<IFastString*>(this);
else return 0;
// request for unsupported interface
// Π·Π°ΠΏΡΠΎΡ Π½Π° Π½Π΅ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ
}
Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΏΠΎΡΠΎΠΆΠ΄Π°Π΅ΡΡΡ ΠΎΡ ΡΠΈΠΏΠ°, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠ³ΠΎ Π² ΡΡΠΎΠΌ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠΈ, ΠΎΡΡΡΠ°Π½ΡΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ Π²Π΅ΡΡΠΈΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ² ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠΎΡΡΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΊ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ° this, ΡΡΠΎΠ±Ρ Π½Π°ΠΉΡΠΈ Π½Π°ΡΠ°Π»ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°.
ΠΡΠΌΠ΅ΡΠΈΠΌ, ΡΡΠΎ ΠΏΠΎΡΠ»Π΅ Π·Π°ΠΏΡΠΎΡΠ° Π½Π° ΠΎΠ±ΡΠΈΠΉ Π±Π°Π·ΠΎΠ²ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ IExtensibleObject ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅ΡΡΡ Π² IFastString. ΠΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΏΠΎΡΠΎΠΌΡ, ΡΡΠΎ ΠΈΠ½ΡΡΠΈΡΠΈΠ²Π½Π°Ρ Π²Π΅ΡΡΠΈΡ (intuitive version) ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ°
return static_cast<IExtensibleObject*>(this);
Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°ΡΠ½Π°, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΈ IFastString, ΠΈ IPersistentObject ΠΏΠΎΡΠΎΠΆΠ΄Π΅Π½Ρ ΠΎΡ IExtensibleObject. ΠΡΠ»ΠΈ Π±Ρ IExtensibleObject Π±ΡΠ» Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠΌ Π±Π°Π·ΠΎΠ²ΡΠΌ ΠΊΠ»Π°ΡΡΠΎΠΌ ΠΊΠ°ΠΊ Π΄Π»Ρ IFastString, ΡΠ°ΠΊ ΠΈ Π΄Π»Ρ IPersistentObject, ΡΠΎ Π΄Π°Π½Π½ΠΎΠ΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ Π±ΡΠ»ΠΎ Π±Ρ Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°ΡΠ½ΡΠΌ ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ Π±Ρ ΠΎΡΡΡΠ°Π½ΡΠ»ΠΈΡΠΎΠ²Π°Π»ΡΡ. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΡ Π±Π°Π·ΠΎΠ²ΡΡ ΠΊΠ»Π°ΡΡΠΎΠ² Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ Π½Π° ΡΡΠ°ΠΏΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π½Π΅Π½ΡΠΆΠ½ΡΡ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡ Π² ΡΠ΅Π·ΡΠ»ΡΡΠΈΡΡΡΡΠΈΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΈ ΠΊ ΡΠΎΠΌΡ ΠΆΠ΅ Π²Π½ΠΎΡΠΈΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ ΠΎΡ ΡΡΠ°Π½ΡΠ»ΡΡΠΎΡΠ°. ΠΠ΅Π»ΠΎ Π² ΡΠΎΠΌ, ΡΡΠΎ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠ΅ Π±Π°Π·ΠΎΠ²ΡΠ΅ ΠΊΠ»Π°ΡΡΡ ΡΠ²Π»ΡΡΡΡΡ Π²ΡΠ΅Π³ΠΎ Π»ΠΈΡΡ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΡΠΌΠΈ ΡΠ·ΡΠΊΠ° C++, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠΌΠ΅ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ.
Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠ΅ΡΡΡΡΠ°ΠΌΠΈ
ΠΡΠ΅ ΠΎΠ΄Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ² ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΡΡΠ½Π΅Π΅, Π΅ΡΠ»ΠΈ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΡ ΡΡ Π΅ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ ΠΌΠ΅ΡΠΎΠ΄Π° DynamicCast. Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠ»Π΅Π΄ΡΡΡΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ:
void f(void)
{
IFastString *pfs = 0;
IPersistentObject *ppo = 0;
pfs = CreateFastString(Β«Feed BOBΒ»);
if (pfs) {
ppo = (IPersistentObject *) pfs->DynamicCast(Β«IPersistentObjectΒ»);
if (!ppo) pfs->Delete();
else { ppo->Save(Β«C:\\autoexec.batΒ»);
ppo->Delete(); }
}
}
Π₯ΠΎΡΡ Π²Π½Π°ΡΠ°Π»Π΅ ΠΎΠ±ΡΠ΅ΠΊΡ Π±ΡΠ» ΡΠ²ΡΠ·Π°Π½ ΡΠ΅ΡΠ΅Π· ΡΠ²ΠΎΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ IFastString , ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΠΉ ΠΊΠΎΠ΄ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΠΌΠ΅ΡΠΎΠ΄ Delete ΡΠ΅ΡΠ΅Π· ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ IPersistentObject. Π‘ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΠ²ΠΎΠΉΡΡΠ²Π° C++ ΠΎ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅Π½Π½ΠΎΠΌ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠΈ ΡΡΠΎ Π²ΠΏΠΎΠ»Π½Π΅ Π΄ΠΎΠΏΡΡΡΠΈΠΌΠΎ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π²ΡΠ΅ ΡΠ°Π±Π»ΠΈΡΡ vtbl , ΠΏΠΎΡΠΎΠΆΠ΄Π΅Π½Π½ΡΠ΅ ΠΊΠ»Π°ΡΡΠΎΠΌ IExtensibleObject, ΡΠΊΠ°ΠΆΡΡ Π½Π° Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΌΠ΅ΡΠΎΠ΄Π° Delete . Π’Π΅ΠΏΠ΅ΡΡ, ΠΎΠ΄Π½Π°ΠΊΠΎ, ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ ΡΠ°Π½ΠΈΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊΠΈΠ΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ ΡΠ²ΡΠ·Π°Π½Ρ Ρ ΠΊΠ°ΠΊΠΈΠΌΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ, ΠΈ Π²ΡΠ·ΡΠ²Π°ΡΡ Delete ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π· Π½Π° ΠΎΠ±ΡΠ΅ΠΊΡ. Π ΡΠ»ΡΡΠ°Π΅ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π²ΡΡΠ΅, ΡΡΠΎ Π½Π΅ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΡΡΠΆΠ΅Π»ΠΎΠ΅ Π±ΡΠ΅ΠΌΡ. ΠΠ»Ρ Π±ΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΡ ΠΊΠΎΠ΄ΠΎΠ² ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΡΠΈΠΌΠΈ ΡΠ²ΡΠ·ΡΠΌΠΈ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π΄Π΅Π»ΠΎΠΌ Π²Π΅ΡΡΠΌΠ° ΡΠ»ΠΎΠΆΠ½ΡΠΌ ΠΈ ΡΡΠ΅Π²Π°ΡΡΠΌ ΠΎΡΠΈΠ±ΠΊΠ°ΠΌΠΈ. ΠΠ΄Π½ΠΈΠΌ ΠΈΠ· ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² ΡΠΏΡΠΎΡΠ΅Π½ΠΈΡ Π·Π°Π΄Π°ΡΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΡΠ²Π»ΡΠ΅ΡΡΡ Π²ΠΎΠ·Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎΡΡΠΈ Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΆΠΈΠ·Π½Π΅Π½Π½ΡΠΌ ΡΠΈΠΊΠ»ΠΎΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π½Π° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΡ ΡΠ²Π½ΠΎ ΡΠ΄Π°Π»ΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ Π²ΡΠΊΡΡΠ²Π°Π΅Ρ Π΅ΡΠ΅ ΠΎΠ΄Π½Ρ Π΄Π΅ΡΠ°Π»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ: ΡΠΎΡ ΡΠ°ΠΊΡ, ΡΡΠΎ ΠΎΠ±ΡΠ΅ΠΊΡ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡ Π² Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ (Π² Β«ΠΊΡΡΠ΅Β», on the heap).
ΠΡΠΎΡΡΠ΅ΠΉΡΠ΅Π΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ β Π²Π²Π΅ΡΡΠΈ Π² ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΡΠ΅ΡΡΠΈΠΊ ΡΡΡΠ»ΠΎΠΊ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅ΡΡΡ, ΠΊΠΎΠ³Π΄Π° ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Π΄ΡΠ±Π»ΠΈΡΡΠ΅ΡΡΡ, ΠΈ ΡΠΌΠ΅Π½ΡΡΠ°Π΅ΡΡΡ, ΠΊΠΎΠ³Π΄Π° ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° ΡΠ½ΠΈΡΡΠΎΠΆΠ°Π΅ΡΡΡ. ΠΡΠΎ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ IExtensibleObject Ρ
class IExtensibleObject
{
public:
virtual void *DynamicCast (const char* pszType) =0;
virtual void Delete(void) = 0;
};
Π½Π°
class IExtensibleObject
{
public:
virtual void *DynamicCast(const char* pszType) = 0;
virtual void DuplicatePointer(void) = 0;
virtual void DestroyPointer(void) = 0;
};
Π Π°Π·ΠΌΠ΅ΡΡΠΈΠ² ΡΡΠΈ ΠΌΠ΅ΡΠΎΠ΄Ρ, Π²ΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ IExtensibleObject Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠ΅ΠΏΠ΅ΡΡ ΠΏΡΠΈΠ΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΡ Π΄Π²ΡΡ ΡΠΎΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ:
1) ΠΠΎΠ³Π΄Π° ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Π΄ΡΠ±Π»ΠΈΡΡΠ΅ΡΡΡ, ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π²ΡΠ·ΠΎΠ² DuplicatePointer.
2) ΠΠΎΠ³Π΄Π° ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Π±ΠΎΠ»Π΅Π΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ, ΡΠ»Π΅Π΄ΡΠ΅Ρ Π²ΡΠ·Π²Π°ΡΡ DestroyPointer.
ΠΡΠΈ ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠ΅: Π½ΡΠΆΠ½ΠΎ ΠΏΡΠΎΡΡΠΎ ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π΄Π΅ΠΉΡΡΠ²ΡΡΡΠΈΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ ΠΈ ΡΠ½ΠΈΡΡΠΎΠΆΠ°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ, ΠΊΠΎΠ³Π΄Π° Π½Π΅Π²ΡΠΏΠΎΠ»Π½Π΅Π½Π½ΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ Π½Π΅ ΠΎΡΡΠ°Π»ΠΎΡΡ:
class FastString : public IFastString,
public IPersistentObject
{
int mcPtrs;
// count of outstanding ptrs
// ΡΡΠ΅ΡΡΠΈΠΊ Π½Π΅Π²ΡΠΏΠΎΠ»Π½Π΅Π½Π½ΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ
public:
// initialize pointer count to zero
// ΡΠ±ΡΠΎΡΠΈΡΡ ΡΡΠ΅ΡΡΠΈΠΊ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π² Π½ΡΠ»Ρ
FastString(const char *psz) : mcPtrs(0) { }
void DuplicatePointer(void)
{
// note duplication of pointer
// ΠΎΡΠΌΠ΅ΡΠΈΡΡ Π΄ΡΠ±Π»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ
++mcPtrs;
}
void DestroyPointer(void)
{
// destroy object when last pointer destroyed
// ΡΠ½ΠΈΡΡΠΎΠΆΠΈΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ, ΠΊΠΎΠ³Π΄Π° ΡΠ½ΠΈΡΡΠΎΠΆΠ΅Π½ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ
if (-mcPtrs == 0) delete this;
}
: : :
};
ΠΡΠΎΡ ΡΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ ΠΊΠΎΠ΄ ΠΌΠΎΠ³ Π±Ρ ΠΏΡΠΎΡΡΠΎ Π±ΡΡΡ Π²ΠΊΠ»ΡΡΠ΅Π½ Π² Π±Π°Π·ΠΎΠ²ΡΠΉ ΠΊΠ»Π°ΡΡ ΠΈΠ»ΠΈ Π² ΠΌΠ°ΠΊΡΠΎΡ Π‘-ΠΏΡΠ΅ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ°, ΡΡΠΎΠ±Ρ Π΅Π³ΠΎ ΠΌΠΎΠ³Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π²ΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ.
Π§ΡΠΎΠ±Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΡΡΠΈ ΠΌΠ΅ΡΠΎΠ΄Ρ, Π²ΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠ°Π½ΠΈΠΏΡΠ»ΠΈΡΡΡΡ ΠΈΠ»ΠΈ ΡΠΏΡΠ°Π²Π»ΡΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΡΠΌΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°, Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΡΠΈΠ΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ Π΄Π²ΡΡ ΠΏΡΠΎΡΡΡΡ ΠΏΡΠ°Π²ΠΈΠ» DuplicatePointer/DestroyPointer. ΠΠ»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ FastString ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΡ Π΄Π²ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ. Π€ΡΠ½ΠΊΡΠΈΡ CreateFastString Π±Π΅ΡΠ΅Ρ Π½Π°ΡΠ°Π»ΡΠ½ΡΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠΉ Π½ΠΎΠ²ΡΠΌ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠΌ C++, ΠΈ ΠΊΠΎΠΏΠΈΡΡΠ΅Ρ Π΅Π³ΠΎ Π² ΡΡΠ΅ΠΊ Π΄Π»Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ° ΠΊΠ»ΠΈΠ΅Π½ΡΡ. Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ Π²ΡΠ·ΠΎΠ² DuplicatePointer:
IFastString* CreateFastString(const char *psz)
{
IFastString *pfsResult = new FastString(psz);
if (pfsResult) pfsResult->DuplicatePointer();
return pfsResult;
}
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΊΠΎΠΏΠΈΡΡΠ΅Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ΠΈ Π² Π΄ΡΡΠ³ΠΎΠΌ ΠΌΠ΅ΡΡΠ΅ β Π² ΠΌΠ΅ΡΠΎΠ΄Π΅ Dynamic_Cast:
void *FastString::Dynamic_Cast(const char *pszType)
{
void *pvResult = 0;
if (strcmp(pszType, Β«IFastStringΒ») == 0) pvResult = static_cast<IFastString*>(this);
else if (strcmp(pszType, Β«IPersistentObjectΒ») == 0) pvResult = static_cast<IPersistentObject*>(this);
else if (strcmp(pszType, Β«IExtensibleObjectΒ») == 0) pvResult = static_cast<IFastString*>(this);
else return 0;
// request for unsupported interface
// Π·Π°ΠΏΡΠΎΡ Π½Π° Π½Π΅ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ
// pvResult now contains a duplicated pointer, so
// we must call DuplicatePointer prior to returning
// ΡΠ΅ΠΏΠ΅ΡΡ pvResult ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ,
// ΠΏΠΎΡΡΠΎΠΌΡ Π½ΡΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄ Π²ΠΎΠ·Π²ΡΠ°ΡΠΎΠΌ Π²ΡΠ·Π²Π°ΡΡ DuplicatePointer
((IExtensibleObject*)pvResult)->DuplicatePo1nter();
return pvResult;
}
Π‘ ΡΡΠΈΠΌΠΈ Π΄Π²ΡΠΌΡ ΡΡΠΎΠ²Π΅ΡΡΠ΅Π½ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΡΠΌΠΈ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ ΠΊΠΎΠ΄ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΡΠΎΠ΄Π½ΡΠΌ ΠΈ ΠΏΡΠΎΠ·ΡΠ°ΡΠ½ΡΠΌ:
void f(void)
{
IFastString *pfs = 0;
IPersistentObject *ppo = 0;
pfs = CreateFastString(Β«Feed BOBΒ»);
if (pts) {
ΡΡΠΎ = (IPersistentObject *) pfs->DynamicCast(Β«IPersistentObjectΒ»);
if (ppo) { ppo->Save(Β«C:\\autoexec.batΒ»);
ppo->DestroyPointer(); }
pfs->DestroyPointer(); }
}
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ΡΠ΅ΠΏΠ΅ΡΡ ΡΡΠ°ΠΊΡΡΠ΅ΡΡΡ ΠΊΠ°ΠΊ Π°Π²ΡΠΎΠ½ΠΎΠΌΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ Ρ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΆΠΈΠ·Π½ΠΈ, ΠΊΠ»ΠΈΠ΅Π½ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠΎΠ²Π°ΡΡΡΡ ΡΠ΅ΠΌ, ΠΊΠ°ΠΊΠΎΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ ΠΊΠ°ΠΊΠΎΠΌΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ. ΠΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΏΡΠΎΡΡΠΎ ΠΏΡΠΈΠ΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ Π΄Π²ΡΡ ΠΏΡΠΎΡΡΡΡ ΠΏΡΠ°Π²ΠΈΠ» ΠΈ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌ ΡΠ°ΠΌΠΈΠΌ ΡΠΏΡΠ°Π²Π»ΡΡΡ ΡΠ²ΠΎΠΈΠΌ Π²ΡΠ΅ΠΌΠ΅Π½Π΅ΠΌ ΠΆΠΈΠ·Π½ΠΈ. ΠΡΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ ΡΠΏΠΎΡΠΎΠ± Π²ΡΠ·ΠΎΠ²Π° DuplicatePointer ΠΈ DestroyPointer ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΡΠΊΡΡΡΡ Π·Π° ΠΈΠ½ΡΠ΅Π»Π»Π΅ΠΊΡΡΠ°Π»ΡΠ½ΡΠΌ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΌ (smart pointer) C++.
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΠΎΠΉ ΡΡ Π΅ΠΌΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ ΡΡΡΠ»ΠΎΠΊ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π²Π΅ΡΡΠΌΠ° Π΅Π΄ΠΈΠ½ΠΎΠΎΠ±ΡΠ°Π·Π½ΠΎ Π²ΡΡΡΠ°Π²Π»ΡΡΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅Π½Π½ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ. ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π²ΡΡΡΠ°Π²Π»Π΅Π½ΠΈΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ² ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΈΠΏΡ Π΄Π°Π½Π½ΡΡ ΡΡΠ°ΡΡΠ²ΠΎΠ²Π°ΡΡ Π² ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ°Ρ . ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π½ΠΎΠ²Π°Ρ ΠΏΠΎΡΡΠΎΡΠ½Π½Π°Ρ ΠΏΠΎΠ΄ΡΠΈΡΡΠ΅ΠΌΠ° ΠΌΠΎΠ³Π»Π° Π±Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π΄Π»Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π°Π²ΡΠΎΠ·Π°Π³ΡΡΠ·ΠΊΠΎΠΉ ΠΈ Π°Π²ΡΠΎΠ·Π°ΠΏΠΈΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Π½Π° Π½Π΅ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ Π½ΠΎΡΠΈΡΠ΅Π»Ρ. ΠΠ»Π°ΡΡ FastString ΠΌΠΎΠ³ Π±Ρ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ ΡΡΠΈΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ ΠΏΡΠΎΡΡΡΠΌ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΎΡ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° ΡΡΠΎΠΉ ΠΏΠΎΠ΄ΡΠΈΡΡΠ΅ΠΌΡ. ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡΡΠΎΠΉ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ ΠΏΠΎΠ²Π»ΠΈΡΠ΅Ρ Π½Π° ΡΠΆΠ΅ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΠ΅ Π±Π°Π·Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅, ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΠΏΡΠ΅ΠΆΠ½ΠΈΠΉ ΠΏΠΎΡΡΠΎΡΠ½Π½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π΄Π»Ρ Π·Π°ΠΏΠΈΡΠΈ ΠΈ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΡΡΡΠΎΠΊΠΈ Π½Π° Π΄ΠΈΡΠΊ. ΠΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½ΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ² Π½Π° ΡΡΠ°ΠΏΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΌΠΎΠΆΠ΅Ρ ΡΠ»ΡΠΆΠΈΡΡ ΠΊΡΠ°Π΅ΡΠ³ΠΎΠ»ΡΠ½ΡΠΌ ΠΊΠ°ΠΌΠ½Π΅ΠΌ Π΄Π»Ρ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ ΠΈΠ· ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡΡΡ ΡΠΎ Π²ΡΠ΅ΠΌΠ΅Π½Π΅ΠΌ.