Π’ΡΠ΅Π±ΡΠ΅ΡΡΡ, ΡΡΠΎΠ±Ρ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΊΠ»Π°ΡΡΠ° ΠΈΠΌΠ΅Π» ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠΉ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ.
Π Π΅ΡΠ΅Π½ΠΈΠ΅ΠΠ»Ρ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΠ³ΠΎ Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ-ΡΠ»Π΅Π½. Π ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ΅ ΠΏΡΠΈΡΠ²ΠΎΠΉΡΠ΅ ΡΠ΅ΠΊΡΡΠ΅ΠΌΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠ΅ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, Π° Π·Π°ΡΠ΅ΠΌ ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠΈΡΡΠΉΡΠ΅ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ. Π§ΡΠΎΠ±Ρ ΠΏΠΎΠ½ΡΡΡ, ΠΊΠ°ΠΊ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, ΠΏΠΎΡΠΌΠΎΡΡΠΈΡΠ΅ Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ 8.8.
ΠΡΠΈΠΌΠ΅Ρ 8.8. ΠΡΠΈΡΠ²ΠΎΠ΅Π½ΠΈΠ΅ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠ²
#include <iostream>
class UniqueID {
protected:
static int nextID;
public:
int id;
UniqueID();
UniqueID(const UniqueID& orig);
UniqueID& operator=(const UniqueID& orig);
};
int UniqueID::nextID = 0;
UniqueID::UniqueID() {
id = ++nextID;
}
UniqueID::UniqueID(const UniqueID& orig) {
id = orig.id;
}
UniqueID& UniqueID::operator=(const UniqueID& orig) {
id = orig.id;
return(*this);
}
int main() {
UniqueID a;
std::cout << a.id << std::endl;
UniqueID b;
std::cout << b.id << std::endl;
UniqueID c;
std::cout << c.id << std::endl;
}
ΠΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΠ»Ρ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΠ³ΠΎ Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ. Π ΠΏΡΠΈΠΌΠ΅ΡΠ΅ 8.8 ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ static int, Π½ΠΎ Π²ΠΌΠ΅ΡΡΠΎ Π½Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π²ΡΠ΅, ΡΡΠΎ ΡΠ³ΠΎΠ΄Π½ΠΎ, ΠΏΡΠΈ ΡΡΠ»ΠΎΠ²ΠΈΠΈ, ΡΡΠΎ ΠΈΠΌΠ΅Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΌΠΎΠΆΠ΅Ρ Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ.
Π Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΡ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡΠ΄Π΅Ρ Π΄ΠΎΡΡΠΈΠ³Π½ΡΡΠΎ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ΅ Π΄Π»Ρ ΡΠ΅Π»ΠΎΠ³ΠΎ ΡΠΈΡΠ»Π° Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅. ΠΡΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π΅Π³ΠΎ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΠΏΠ°Π΄Π°Π΅Ρ Π»ΠΈΠ±ΠΎ Π΄ΠΎ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΡΡΠΊΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, Π»ΠΈΠ±ΠΎ Π΄ΠΎ ΠΏΠ΅ΡΠ΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ°. ΠΡΠ° ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΠΎΡΡΡ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΡ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ². ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΎΠΉ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΏΠ°ΠΌΡΡΡΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°Π΅Ρ Π±Π»ΠΎΠΊΠΈ ΠΏΠ°ΠΌΡΡΠΈ ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ, ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΡΡ ΡΠ²Π΅ΡΠ΅Π½Π½ΡΠΌ, ΡΡΠΎ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π±ΡΠ΄Π΅Ρ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΎ Π΅Π³ΠΎ ΠΏΠ΅ΡΠ²ΠΎΠ½Π°ΡΠ°Π»ΡΠ½ΠΎΠ΅ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅. ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Π² ΡΠΎΡΠ΅ΡΠ°Π½ΠΈΠΈ Ρ ΡΠ΅ΡΠ΅ΠΏΡΠΎΠΌ 8.4, Π½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ map Π²ΠΌΠ΅ΡΡΠΎ list ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ Π½Π°ΠΉΡΠΈ ΠΎΠ±ΡΠ΅ΠΊΡ Ρ Π·Π°Π΄Π°Π½Π½ΡΠΌ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠΌ Π½ΠΎΠΌΠ΅ΡΠΎΠΌ. Π§ΡΠΎΠ±Ρ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ, ΠΏΡΠΎΡΡΠΎ ΠΎΡΠΎΠ±ΡΠ°Π·ΠΈΡΠ΅ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠ΅ ID Π½Π° ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², ΠΊΠ°ΠΊ Π·Π΄Π΅ΡΡ.
static map<int, MyClass*> instmap;
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ Π»ΡΠ±ΠΎΠΉ ΠΊΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², Π²ΡΠ΅Π³Π΄Π° ΡΠΌΠΎΠΆΠ΅Ρ Π½Π°ΠΉΡΠΈ Π΅Π³ΠΎ Π±Π΅Π· Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ Ρ ΡΠ°Π½ΠΈΡΡ ΡΡΡΠ»ΠΊΡ Π½Π° Π½Π΅Π³ΠΎ.
ΠΠΎ ΡΡΠΎ Π΅ΡΠ΅ Π½Π΅ Π²ΡΠ΅. Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠ»ΡΡΠ°ΠΉ, ΠΊΠΎΠ³Π΄Π° ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΡΡΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π² ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ (vector, list, set ΠΈ Ρ.ΠΏ.). Π‘ΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ Ρ ΡΠ°Π½ΡΡ ΠΊΠΎΠΏΠΈΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ², Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌΡΡ Π² Π½ΠΈΡ , Π° Π½Π΅ ΡΡΡΠ»ΠΊΠΈ ΠΈΠ»ΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ Π½Π° ΡΡΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΡ (ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, ΠΏΡΠΈ ΡΡΠ»ΠΎΠ²ΠΈΠΈ, ΡΡΠΎ ΡΡΠΎ Π½Π΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ). Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ ΠΎΠΆΠΈΠ΄Π°ΡΡ, ΡΡΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π² Π½ΠΈΡ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡΡ, Π²Π΅Π΄ΡΡ ΡΠ΅Π±Ρ ΠΊΠ°ΠΊ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ, ΡΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΠΏΡΠΈ ΠΏΡΠΈΡΠ²ΠΎΠ΅Π½ΠΈΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° ΠΏΡΠΈΡΠ²ΠΎΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ° ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ Π½ΠΎΠ²Π°Ρ Π²Π΅ΡΡΠΈΡ, ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½Π°Ρ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ.
ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠ΅ΡΠΈΡΡ, ΠΊΠ°ΠΊ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠ΅Π±Ρ Π²Π΅ΡΡΠΈ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ. ΠΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Ρ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠΌ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠΌ ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π΅Π³ΠΎ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ Ρ Π²Π°Ρ ΠΏΠΎΡΠ²ΡΡΡΡ Π΄Π²Π° ΠΎΠ±ΡΠ΅ΠΊΡΠ° Ρ ΠΎΠ΄Π½ΠΈΠΌ ΠΈ ΡΠ΅ΠΌ ΠΆΠ΅ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠΌ ΠΏΡΠΈ ΡΡΠ»ΠΎΠ²ΠΈΠΈ, ΡΡΠΎ Π²Ρ Π½Π΅ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠ»ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ ΠΏΡΠΈΡΠ²ΠΎΠ΅Π½ΠΈΡ. Π ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ΅ ΠΏΡΠΈΡΠ²ΠΎΠ΅Π½ΠΈΡ ΠΈ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ΅ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠΌΠ΅ΡΡ ΡΠΌΡΡΠ» Π΄Π»Ρ Π²Π°ΡΠ΅Π³ΠΎ ΡΠ»ΡΡΠ°Ρ. ΠΠΌΠ΅Π΅Ρ Π»ΠΈ ΡΠΌΡΡΠ» ΡΠΎ, ΡΡΠΎ ΠΎΠ±ΡΠ΅ΠΊΡ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ΅ Π±ΡΠ΄Π΅Ρ ΡΠ°Π²Π΅Π½ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΠΎΠΌΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ? ΠΡΠ»ΠΈ Π΄Π°, ΡΠΎ Π²ΠΏΠΎΠ»Π½Π΅ ΠΏΠΎΠ΄ΠΎΠΉΠ΄Π΅Ρ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ ΠΏΡΠΈΡΠ²ΠΎΠ΅Π½ΠΈΡ, Π½ΠΎ Π²Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠΊΠ°Π·Π°ΡΡ ΡΡΠΎ ΡΠ²Π½ΠΎ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ Π²Π°ΡΠ΅Π³ΠΎ ΠΊΠ»Π°ΡΡΠ° Π·Π½Π°Π»ΠΈ, ΡΡΠΎ Π²Ρ Π΄Π΅Π»Π°Π΅ΡΠ΅ ΡΡΠΎ Π½Π°ΠΌΠ΅ΡΠ΅Π½Π½ΠΎ, Π° Π½Π΅ ΠΏΡΠΎΡΡΠΎ Π·Π°Π±ΡΠ»ΠΈ, ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΠΎΠ±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠ΄Π½ΠΎ ΠΈ ΡΠΎ ΠΆΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ°, ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ ΠΏΡΠΈΡΠ²ΠΎΠ΅Π½ΠΈΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ Π²ΠΎΡ ΡΠ°ΠΊ.
UniqueID::UniqueID(const UniqueID& orig) {
id = orig.id;
}
UniqueID& UniqueID::operator=(const UniqueID& orig) {
id = orig.id;
return(*this);
}
ΠΠΎ ΠΌΠΎΠΆΠ΅Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡΡΡ ΡΠΈΡΡΠ°ΡΠΈΡ, ΠΊΠΎΠ³Π΄Π° Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π±ΡΠ΄Π΅Ρ ΠΈΠΌΠ΅ΡΡ ΡΠΌΡΡΠ» ΡΠΎΠ·Π΄Π°ΡΡ Π΄Π»Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ΅ Π½ΠΎΠ²ΠΎΠ΅ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅. Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΡΠΎΡΡΠΎ ΡΠ½ΠΎΠ²Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ, ΠΊΠ°ΠΊ ΡΡΠΎ ΡΠ΄Π΅Π»Π°Π½ΠΎ Π² ΠΎΠ±ΡΡΠ½ΠΎΠΌ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ΅ ΠΈ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π·Π΄Π΅ΡΡ.
UniqueID::UniqueID(const UniqueID& orig) {
id = ++nextID;
}
UniqueID& UniqueID::operator=(const UniqueID& orig) {
id = ++nextID;
return(*this);
}
ΠΠ΄Π½Π°ΠΊΠΎ ΡΡΡΠ΄Π½ΠΎΡΡΠΈ Π΅ΡΠ΅ Π½Π΅ Π·Π°ΠΊΠΎΠ½ΡΠΈΠ»ΠΈΡΡ. ΠΡΠ»ΠΈ UniqueID Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ, Ρ Π²Π°Ρ ΡΠ½ΠΎΠ²Π° Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΌ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΌ Π½Π΅ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½. ΠΠ° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠ΅ΠΉ ΠΎ ΡΠ°Π±ΠΎΡΠ΅ Ρ ΡΠ΅ΡΡΡΡΠ°ΠΌΠΈ ΠΏΡΠΈ Π½Π°Π»ΠΈΡΠΈΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΎΠ±ΡΠ°ΡΠΈΡΠ΅ΡΡ ΠΊ Π³Π»Π°Π²Π΅ 12.
Π‘ΠΌΠΎΡΡΠΈ ΡΠ°ΠΊΠΆΠ΅Π Π΅ΡΠ΅ΠΏΡ 8.3.
8.9. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Singleton-ΠΊΠ»Π°ΡΡΠ°
ΠΠΌΠ΅Π΅ΡΡΡ ΠΊΠ»Π°ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ, ΠΈ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΡΡ ΡΠΏΠΎΡΠΎΠ± Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΡΡΠΎΠΌΡ ΠΊΠ»Π°ΡΡΡ ΠΈΠ· ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΡΠΎΠ±Ρ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π· Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π»ΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΡΠΎΡ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ. Π§Π°ΡΡΠΎ ΡΡΠΎ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ ΡΠ°Π±Π»ΠΎΠ½ΠΎΠΌ singleton ΠΈΠ»ΠΈ singleton-ΠΊΠ»Π°ΡΡΠΎΠΌ.
Π Π΅ΡΠ΅Π½ΠΈΠ΅Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΡΠ»Π΅Π½, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½Π° ΡΠ΅ΠΊΡΡΠΈΠΉ ΠΊΠ»Π°ΡΡ, ΠΎΠ³ΡΠ°Π½ΠΈΡΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠΎΠ² Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΊΠ»Π°ΡΡΠ°, ΡΠ΄Π΅Π»Π°Π² ΠΈΡ private, ΠΈ ΡΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΠΎΡΠΊΡΡΡΡΡ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΡΡ ΡΡΠ½ΠΊΡΠΈΡ-ΡΠ»Π΅Π½, ΠΊΠΎΡΠΎΡΠ°Ρ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π΄Π»Ρ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠΌΡ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΌΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ. ΠΡΠΈΠΌΠ΅Ρ 8.9 Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΠ΅Ρ, ΠΊΠ°ΠΊ ΡΡΠΎ Π΄Π΅Π»Π°Π΅ΡΡΡ.
ΠΡΠΈΠΌΠ΅Ρ 8.9. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ singleton-ΠΊΠ»Π°ΡΡΠ°
#include <iostream>
using namespace std;
class Singleton {
public:
// Π‘ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΡ ΠΏΠΎΠ»ΡΡΠ°Ρ Π΄ΠΎΡΡΡΠΏ ΠΊ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠΌΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ
static Singleton* getInstance();
void setValue(int val) {value_ = val;}
int getValue() {return(value_);}
protected:
int value_;
private:
static Singleton* inst_; // ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΉ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ
Singleton() : value_(0) {} // ΡΠ°ΡΡΠ½ΡΠΉ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ
Singleton(const Singleton&);
Singleton& operator=(const Singleton&);
};
// ΠΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ
static Singleton Singleton* Singleton::inst_ = NULL;
Singleton* Singleton::getInstance() {
if (inst_ == NULL) {
inst_ = new Singleton();
}
return(inst_);
}
int main() {
Singleton* p1 = Singleton::getInstance();
p1->setValue(10);
Singleton* p2 = Singleton::getInstance();
cout << "Value = " << p2->getValue() << '\n';
}
ΠΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠ΅Π‘ΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΡΠΈΡΡΠ°ΡΠΈΠΉ, ΠΊΠΎΠ³Π΄Π° ΡΡΠ΅Π±ΡΠ΅ΡΡΡ, ΡΡΠΎΠ±Ρ Ρ ΠΊΠ»Π°ΡΡΠ° ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π» ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ. ΠΠ»Ρ ΡΡΠΎΠΉ ΡΠ΅Π»ΠΈ ΡΠ»ΡΠΆΠΈΡ ΡΠ°Π±Π»ΠΎΠ½ Singleton. ΠΡΠΏΠΎΠ»Π½ΠΈΠ² Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΎΡΡΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ singleton-ΠΊΠ»Π°ΡΡ Π² Π‘++.
ΠΠΎΠ³Π΄Π° ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅ΡΡΡ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅, ΡΡΠΎ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ ΡΠ΅Π³ΠΎ-Π»ΠΈΠ±ΠΎ, ΡΠΎ Π½Π° ΡΠΌ ΡΡΠ°Π·Ρ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ static. ΠΠ°ΠΊ Π±ΡΠ»ΠΎ ΡΠΊΠ°Π·Π°Π½ΠΎ Π² ΡΠ΅ΡΠ΅ΠΏΡΠ΅ 8.5, ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ-ΡΠ»Π΅Π½ static β ΡΡΠΎ ΡΠ°ΠΊΠ°Ρ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ Π² ΠΏΠ°ΠΌΡΡΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ. ΠΠ»Ρ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΡ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° singleton-ΠΊΠ»Π°ΡΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ-ΡΠ»Π΅Π½ static, ΠΊΠ°ΠΊ ΡΠ΄Π΅Π»Π°Π½ΠΎ Π² ΠΏΡΠΈΠΌΠ΅ΡΠ΅ 8.9.
private:
static Singleton* inst_;
Π§ΡΠΎΠ±Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΠΉ ΠΊΠΎΠ΄ Π½ΠΈΡΠ΅Π³ΠΎ ΠΏΡΠΎ Π½Π΅Π΅ Π½Π΅ Π·Π½Π°Π», ΡΠ΄Π΅Π»Π°ΠΉΡΠ΅ Π΅Π΅ private. Π£Π±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ Π² ΡΠ°ΠΉΠ»Π΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΎΠ½Π° ΠΏΡΠΎΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π° Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ NULL.
Singleton* Singleton::inst_ = NULL;
Π§ΡΠΎΠ±Ρ Π·Π°ΠΏΡΠ΅ΡΠΈΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ ΡΡΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ°, ΡΠ΄Π΅Π»Π°ΠΉΡΠ΅ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΡ private, ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ.
private:
Singleton() {}
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π΅ΡΠ»ΠΈ ΠΊΡΠΎ-ΡΠΎ ΠΏΠΎΠΏΡΠΎΠ±ΡΠ΅Ρ ΡΠΎΠ·Π΄Π°ΡΡ Π² ΠΊΡΡΠ΅ ΠΈΠ»ΠΈ ΡΡΠ΅ΠΊΠ΅ Π½ΠΎΠ²ΡΠΉ singleton-ΠΊΠ»Π°ΡΡ, ΡΠΎ ΠΎΠ½ ΠΏΠΎΠ»ΡΡΠΈΡ Π΄ΡΡΠΆΠ΅ΡΡΠ²Π΅Π½Π½ΡΡ ΠΎΡΠΈΠ±ΠΊΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ°.
Π’Π΅ΠΏΠ΅ΡΡ, ΠΊΠΎΠ³Π΄Π° ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Singleton ΡΠΎΠ·Π΄Π°Π½Π°, ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Singleton ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠΎΠ²; Π²ΡΠ΅, ΡΡΠΎ ΠΎΡΡΠ°Π»ΠΎΡΡ ΡΠ΄Π΅Π»Π°ΡΡ, β ΡΡΠΎ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°ΠΌ ΡΠΏΠΎΡΠΎΠ± Π΄ΠΎΡΡΡΠΏΠ° ΠΊ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠΌΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Singleton. ΠΡΠΎ Π΄Π΅Π»Π°Π΅ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ-ΡΠ»Π΅Π½Π°.
Singleton* Singleton::getInstance() {
if (inst_ == NULL) {
inst_ = new Singleton();
}
return(inst_);
}
ΠΠΎΡΠΌΠΎΡΡΠΈΡΠ΅, ΠΊΠ°ΠΊ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ. ΠΡΠ»ΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ static Singleton ΡΠ°Π²Π΅Π½ NULL, ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ. ΠΡΠ»ΠΈ ΠΎΠ½ ΡΠΆΠ΅ Π±ΡΠ» ΡΠΎΠ·Π΄Π°Π½, ΡΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ Π΅Π³ΠΎ Π°Π΄ΡΠ΅Ρ. ΠΠ»ΠΈΠ΅Π½ΡΡ ΠΌΠΎΠ³ΡΡ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΡ Singleton, Π²ΡΠ·Π²Π°Π² Π΅Π³ΠΎ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΌΠ΅ΡΠΎΠ΄.