ΠΠ»Π°Π²Π° 15
Π Π°Π·Π½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ
15.0. ΠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
Π ΡΡΠΎΠΉ Π³Π»Π°Π²Π΅ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Π°ΡΠΏΠ΅ΠΊΡΡ C++, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠ»ΠΎΡ ΠΎ Π²ΠΏΠΈΡΡΠ²Π°ΡΡΡΡ Π² ΡΠ΅ΠΌΠ°ΡΠΈΠΊΡ Π»ΡΠ±ΠΎΠΉ Π΄ΡΡΠ³ΠΎΠΉ Π³Π»Π°Π²Ρ: ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΈ ΡΠ»Π΅Π½ΠΎΠ², ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ- ΡΠ»Π΅Π½Ρ, Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ (Ρ.Π΅. Π½Π΅ ΡΠ»Π΅Π½Ρ ΠΊΠ»Π°ΡΡΠ°) ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π΄ΡΡΠ³ΠΈΡ ΡΠ΅ΠΌ.
15.1. ΠΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ ΡΡΠ½ΠΊΡΠΈΠΉ Π΄Π»Ρ ΠΈΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π°
ΠΠ»Π°Π½ΠΈΡΡΠ΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ func1, ΠΊΠΎΡΠΎΡΠ°Ρ Π½Π° ΡΡΠ°ΠΏΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π΄ΠΎΠ»ΠΆΠ½Π° Π²ΡΠ·ΡΠ²Π°ΡΡ Π΄ΡΡΠ³ΡΡ ΡΡΠ½ΠΊΡΠΈΡ func2. ΠΠ΄Π½Π°ΠΊΠΎ ΠΏΠΎ ΡΠΎΠΉ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΉ ΠΏΡΠΈΡΠΈΠ½Π΅ Π½Π΅Π»ΡΠ·Ρ Π²Π½ΡΡΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ func1 ΠΆΠ΅ΡΡΠΊΠΎ Π·Π°ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°ΡΡ ΠΈΠΌΡ ΡΡΠ½ΠΊΡΠΈΠΈ func2. ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΈΠΌΡ ΡΡΠ½ΠΊΡΠΈΠΈ func2 Π½Π΅ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ Π½Π° ΡΡΠ°ΠΏΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ, ΠΈΠ»ΠΈ func1 ΠΎΡΠ½ΠΎΡΠΈΡΡΡ ΠΊ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠΌΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎΠ³ΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°, ΠΈ ΠΎΠ½Π° Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π° ΠΈ ΠΏΠ΅ΡΠ΅ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°Π½Π° Π Π»ΡΠ±ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π²Π°ΠΌ ΠΏΡΠΈΠ΄Π΅ΡΡΡ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π° (callback function).
Π Π΅ΡΠ΅Π½ΠΈΠ΅ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΡΠΊΠ°Π·Π°Π½Π½ΡΡ Π²ΡΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΎΠ±ΡΡΠ²ΠΈΡΠ΅ func1 Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΌ Π½Π° ΡΡΠ½ΠΊΡΠΈΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠ²ΠΎΠ΅Π³ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΠΉΡΠ΅ Π΅ΠΉ Π°Π΄ΡΠ΅Ρ func2 Π½Π° ΡΡΠ°ΠΏΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ. ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ typedef, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π»Π΅Π³ΡΠ΅ ΡΠΈΡΠ°Π»Π°ΡΡ ΠΈ ΠΎΡΠ»Π°ΠΆΠΈΠ²Π°Π»Π°ΡΡ. ΠΡΠΈΠΌΠ΅Ρ 15.1 ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π°, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΡΠ½ΠΊΡΠΈΡ.
ΠΡΠΈΠΌΠ΅Ρ 15.1. Π€ΡΠ½ΠΊΡΠΈΡ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π°
#include <iostream>
// ΠΡΠΈΠΌΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π°
bool updateProgress(int pct) {
std::cout << pct << "% complete...\n";
return(true);
}
// ΠΡΠΎΡ typedef Π΄Π΅Π»Π°Π΅Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠΉ ΠΊΠΎΠ΄ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ½ΡΡΠ½ΡΠΌ
typedef bool (*FuncPtrBoolInt)(int);
// Π€ΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π΄Π»ΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ
void longOperation(FuncPtrBoolInt f) {
for (long l=0; l < 100000000; l++)
if (l % 10000000 == 0)
f(l/1000000);
}
int main() {
longOperation(updateProgress); // Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ
}
ΠΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠ΅Π ΡΠΈΡΡΠ°ΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Π² ΠΏΡΠΈΠΌΠ΅ΡΠ΅ 15.1, ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΡΠ½ΠΊΡΠΈΡ ΡΠ²Π»ΡΠ΅ΡΡΡ Ρ ΠΎΡΠΎΡΠΈΠΌ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ, Π΅ΡΠ»ΠΈ UpdateProgress ΠΈ longOperation Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ Π·Π½Π°ΡΡ Π΄ΡΡΠ³ ΠΎ Π΄ΡΡΠ³Π΅. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅Ρ ΠΈΠ½Π΄ΠΈΠΊΠ°ΡΠΎΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠ° Π² Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠΌ ΠΎΠΊΠ½Π΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° (user interface β UI), Π² ΠΎΠΊΠ½Π΅ ΠΊΠΎΠ½ΡΠΎΠ»ΡΠ½ΠΎΠ³ΠΎ ΡΠ΅ΠΆΠΈΠΌΠ° ΠΈΠ»ΠΈ Π³Π΄Π΅-ΡΠΎ Π΅ΡΠ΅, Π½Π΅ Π·Π°Π±ΠΎΡΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΎΠ½Π° Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ. ΠΠ½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ ΡΡΠ½ΠΊΡΠΈΡ longOperation ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ°ΡΡΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Π·Π°Π³ΡΡΠ·ΠΊΠΈ Π΄Π°Π½Π½ΡΡ , ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π½Π΅ Π·Π°Π±ΠΎΡΠΈΡ ΠΌΠ΅ΡΡΠΎ Π²ΡΠ·ΠΎΠ²Π°: ΠΈΠ· Π³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ UI, ΠΈΠ· ΠΎΠΊΠ½Π° ΠΊΠΎΠ½ΡΠΎΠ»ΡΠ½ΠΎΠ³ΠΎ ΡΠ΅ΠΆΠΈΠΌΠ° ΠΈΠ»ΠΈ ΠΈΠ· ΡΠΎΠ½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ°.
Π‘Π½Π°ΡΠ°Π»Π° ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΡΠΈΠ³Π½Π°ΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΡ Π²Ρ ΠΏΠ»Π°Π½ΠΈΡΡΠ΅ΡΠ΅ Π²ΡΠ·ΡΠ²Π°ΡΡ, ΠΈ ΡΠΎΠ·Π΄Π°ΡΡ Π΄Π»Ρ Π½Π΅Π΅ typedef. ΠΠΏΠ΅ΡΠ°ΡΠΎΡ typedef β Π²Π°Ρ ΠΏΠΎΠΌΠΎΡΠ½ΠΈΠΊ Π² ΡΠ΅Ρ ΡΠ»ΡΡΠ°ΡΡ , ΠΊΠΎΠ³Π΄Π° ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΠΈΠΌΠ΅ΡΡ Π΄Π΅Π»ΠΎ Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΡΠΌΠΈ ΡΡΠ½ΠΊΡΠΈΠΉ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΎΠ½ΠΈ ΠΈΠΌΠ΅ΡΡ Π½Π΅ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΈΠ²Π»Π΅ΠΊΠ°ΡΠ΅Π»ΡΠ½ΡΠΉ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ. Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ, ΠΊΠ°ΠΊ ΠΎΠ±ΡΡΠ½ΠΎ ΠΎΠ±ΡΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ°ΠΊΠΎΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ f, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π°Π΄ΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡΠ΅ΠΉ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΡΠ΅Π»ΠΎΠ³ΠΎ ΡΠΈΠΏΠ° ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΠ΅ΠΉ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠΈΠΏΠ° boolean. ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ
bool (*f)(int); // f - ΠΈΠΌΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ
ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΏΡΠ°Π²Π΅Π΄Π»ΠΈΠ²ΠΎ Π²ΠΎΠ·ΡΠ°Π·ΠΈΡΡ, ΡΡΠΎ Π·Π΄Π΅ΡΡ Π½Π΅Ρ Π½ΠΈΡΠ΅Π³ΠΎ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΠ³ΠΎ ΠΈ Ρ ΠΏΡΠΎΡΡΠΎ ΠΈΠ·Π»ΠΈΡΠ½Π΅ Π΄ΡΠ°ΠΌΠ°ΡΠΈΠ·ΠΈΡΡΡ ΡΠΈΡΡΠ°ΡΠΈΡ. ΠΠΎ ΡΡΠΎ Π²Ρ ΡΠΊΠ°ΠΆΠ΅ΡΠ΅, Π΅ΡΠ»ΠΈ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ Π²Π΅ΠΊΡΠΎΡ vector ΡΠ°ΠΊΠΈΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ?
vector<bool (*)(int)> vf;
ΠΠ»ΠΈ ΠΈΡ ΠΌΠ°ΡΡΠΈΠ²?
bool (*af[10])(int);
Π€ΠΎΡΠΌΠ° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ Π½Π° ΡΡΠ½ΠΊΡΠΈΠΈ ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΠΎΡ ΠΎΠ±ΡΡΠ½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π‘++, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠ±ΡΡΠ½ΠΎ Π·Π°Π΄Π°ΡΡΡΡ Π² Π²ΠΈΠ΄Π΅ (ΠΊΠ²Π°Π»ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ) ΠΈΠΌΠ΅Π½ΠΈ ΡΠΈΠΏΠ°, Π·Π° ΠΊΠΎΡΠΎΡΡΠΌ ΠΈΠ΄Π΅Ρ ΠΈΠΌΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ. ΠΠΎΡΡΠΎΠΌΡ ΠΎΠ½ΠΈ Π²Π½ΠΎΡΡΡ ΠΏΡΡΠ°Π½ΠΈΡΡ ΠΏΡΠΈ ΡΡΠ΅Π½ΠΈΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°.
ΠΡΠ°ΠΊ, Π² ΠΏΡΠΈΠΌΠ΅ΡΠ΅ 15.1 Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ typedef.
typedef bool (*FuncPtrBoolInt)(int);
Π‘Π΄Π΅Π»Π°Π² ΡΡΠΎ, Ρ ΠΌΠΎΠ³Ρ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎ ΠΎΠ±ΡΡΠ²Π»ΡΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ ΡΡΠ½ΠΊΡΠΈΠΉ Ρ ΡΠΈΠ³Π½Π°ΡΡΡΠΎΠΉ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΠ΅ΠΉ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ bool ΠΈ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡΠ΅ΠΉ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ, ΠΊΠ°ΠΊ ΡΡΠΎ Ρ Π±Ρ Π΄Π΅Π»Π°Π» Π΄Π»Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° Π»ΡΠ±ΠΎΠ³ΠΎ Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ.
void longOperation(FuncPtrBoolInt f) { // ...
Π’Π΅ΠΏΠ΅ΡΡ Π²ΡΠ΅, ΡΡΠΎ Π½Π°Π΄ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ Π² longOperation, β ΡΡΠΎ Π²ΡΠ·Π²Π°ΡΡ f, ΠΊΠ°ΠΊ Π΅ΡΠ»ΠΈ Π±Ρ ΡΡΠΎ Π±ΡΠ»Π° Π»ΡΠ±Π°Ρ ΠΎΠ±ΡΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ.
f(l/1000000);
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·Π°ΠΌ, Π·Π΄Π΅ΡΡ f ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π»ΡΠ±ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΡΠ΅Π»ΠΎΠ³ΠΎ ΡΠΈΠΏΠ° ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ bool. ΠΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΡΠΎ Π² Π²ΡΠ·ΡΠ²Π°ΡΡΠ΅ΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ longOperation Π½Π΅ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°ΡΡ ΠΏΡΠΎΠ΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ½Π΄ΠΈΠΊΠ°ΡΠΎΡΠ° ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠ°. Π’ΠΎΠ³Π΄Π° Π΅ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΡΠ½ΠΊΡΠΈΡ Π±Π΅Π· ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ.
bool whoCares(int i) {return(true);}
//...
longOperation(whoCares);
ΠΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½ΠΎ ΡΠΎ, ΡΡΠΎ Π²ΡΠ±ΠΎΡ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π΅ΠΌΠΎΠΉ longOperation, ΠΌΠΎΠΆΠ΅Ρ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΡΡΡΡ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ Π½Π° ΡΡΠ°ΠΏΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ.
15.2. ΠΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ Π΄Π»Ρ ΡΠ»Π΅Π½ΠΎΠ² ΠΊΠ»Π°ΡΡΠ°
Π’ΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡΡ Π°Π΄ΡΠ΅ΡΠ½ΡΡ ΡΡΡΠ»ΠΊΡ Π½Π° Π΄Π°Π½Π½ΠΎΠ΅-ΡΠ»Π΅Π½ ΠΈΠ»ΠΈ Π½Π° ΡΡΠ½ΠΊΡΠΈΡ-ΡΠ»Π΅Π½.
Π Π΅ΡΠ΅Π½ΠΈΠ΅ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΈΠΌΡ ΠΊΠ»Π°ΡΡΠ° ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ ΠΎΠ±Π»Π°ΡΡΠΈ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ (::) ΡΠΎ Π·Π²Π΅Π·Π΄ΠΎΡΠΊΠΎΠΉ Π΄Π»Ρ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠ³ΠΎ ΠΊΠ²Π°Π»ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈΠΌΠ΅Π½ΠΈ. ΠΡΠΈΠΌΠ΅Ρ 15.2 ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΠΊΠ°ΠΊ ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ.
ΠΡΠΈΠΌΠ΅Ρ 15.2. ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΠ»Π΅Π½ ΠΊΠ»Π°ΡΡΠ°
#include <iostream>
#include <string>
class MyClass {
public:
MyClass() : ival_(0), sval_("foo") {}
~MyClass() {}
void incr() {++ival_;}
void decr() {ival_--;}
private:
std::string sval_;
int ival_;
};
int main() {
MyClass obj;
int MyClass::* mpi = &MyClass::ival_; // Π£ΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ Π½Π°
std::string MyClass::* mps = &MyClass::sval_; // Π΄Π°Π½Π½ΡΠ΅-ΡΠ»Π΅Π½Ρ
void (MyClass::*mpf)(); // Π£ΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΡΠ½ΠΊΡΠΈΡ-ΡΠ»Π΅Π½, Ρ ΠΊΠΎΡΠΎΡΠΎΠΉ
// Π½Π΅Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΠΈ ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ void
void (*pf)(); // ΠΠ±ΡΡΠ½ΡΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΡΠ½ΠΊΡΠΈΡ
int* pi = &obj.ival_; // int-ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ, ΡΡΡΠ»Π°ΡΡΠΈΠΉΡΡ Π½Π° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ-ΡΠ»Π΅Π½
// ΡΠΈΠΏΠ° int, - Π²ΡΠ΅ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ.
mpf = &MyClass::incr; // Π£ΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΡΠ½ΠΊΡΠΈΡ-ΡΠ»Π΅Π½. ΠΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅
// Π·Π°ΠΏΠΈΡΠ°ΡΡ ΡΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π² ΠΏΠΎΡΠΎΠΊ. ΠΠΎΡΠΌΠΎΡΡΠΈΡΠ΅ Π²
// ΠΎΡΠ»Π°Π΄ΡΠΈΠΊΠ΅, ΠΊΠ°ΠΊ ΡΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ.
pf = &MyClass::incr; // ΠΡΠΈΠ±ΠΊΠ°: &MyClass::inc Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠΌ
// ΡΡΠ½ΠΊΡΠΈΠΈ
std::cout << "mpi = " << mpi << '\n';
std::cout << "mps = " << mps << '\n';
std::cout << "pi = " << pi << '\n';
std::cout << "*pi = " << *pi << '\n';
obj.*mpi = 5;
obj.*mps = "bar";
(obj.*mpf)(); // ΡΠ΅ΠΏΠ΅ΡΡ obj.ival_ ΡΠ°Π²Π½ΠΎ 6
std::cout << "obj.ival_ = " << obj.ival_ << '\n';
std::cout << "obj.sval_ = " << obj.sval_ << '\n';
}
ΠΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠ΅Π£ΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ Π½Π° ΡΠ»Π΅Π½Ρ ΠΊΠ»Π°ΡΡΠ° Π²ΡΠ³Π»ΡΠ΄ΡΡ ΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΈΠ½Π°ΡΠ΅, ΡΠ΅ΠΌ ΠΎΠ±ΡΡΠ½ΡΠ΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ. ΠΡΠ΅ΠΆΠ΄Π΅ Π²ΡΠ΅Π³ΠΎ, ΠΎΠ½ΠΈ ΠΈΠΌΠ΅ΡΡ Β«ΡΠΌΠ΅ΡΠ½ΠΎΠΉΒ» ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ (Π½Π΅ Π²ΡΠ·ΡΠ²Π°ΡΡΠΈΠΉ ΡΠΌΠ΅Ρ , Π½ΠΎ ΡΡΡΠ°Π½Π½ΡΠΉ). Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠ»Π΅Π΄ΡΡΡΡΡ ΡΡΡΠΎΠΊΡ ΠΈΠ· ΠΏΡΠΈΠΌΠ΅ΡΠ° 15.2.
int MyClass::* mpi = &MyClass::ival_;
ΠΠ΄Π΅ΡΡ ΠΎΠ±ΡΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ΠΈ Π΅ΠΌΡ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π΅ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ΅Π»ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°, ΠΊΠΎΡΠΎΡΡΠΌ ΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ ΡΠ»Π΅Π½ ΠΊΠ»Π°ΡΡΠ° MyClass. ΠΠ²Π΅ Π²Π΅ΡΠΈ ΠΎΡΠ½ΠΈΠΌΠ°ΡΡ ΡΡΠΎ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ ΠΎΡ ΠΎΠ±ΡΡΠ½ΠΎΠ³ΠΎ int*. ΠΠΎ-ΠΏΠ΅ΡΠ²ΡΡ , Π²Π°ΠΌ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ Π²ΡΡΠ°Π²Π»ΡΡΡ ΠΈΠΌΡ ΠΊΠ»Π°ΡΡΠ° ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ ΠΎΠ±Π»Π°ΡΡΠΈ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠΈΠΏΠΎΠΌ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΈ Π·Π²Π΅Π·Π΄ΠΎΡΠΊΠΎΠΉ. ΠΠΎ-Π²ΡΠΎΡΡΡ , ΠΏΡΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΡ ΡΡΠΎΠΌΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ Π½Π΅ Π½Π°Π·Π½Π°ΡΠ°Π΅ΡΡΡ ΠΊΠ°ΠΊΠΎΠΉ ΡΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΉ Π°Π΄ΡΠ΅Ρ ΠΏΠ°ΠΌΡΡΠΈ. ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ &MyClass::ival_ Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΊΠ°ΠΊΠΈΠΌ-ΡΠΎ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΌΡΡ Π² ΠΏΠ°ΠΌΡΡΠΈ; ΠΎΠ½ΠΎ ΡΡΡΠ»Π°Π΅ΡΡΡ Π½Π° ΠΈΠΌΡ ΠΊΠ»Π°ΡΡΠ°, Π° Π½Π΅ Π½Π° ΠΈΠΌΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, Π½ΠΎ ΡΠΎΠ³Π΄Π° ΡΡΠΎ ΠΆΠ΅ ΡΡΠΎ ΡΠ°ΠΊΠΎΠ΅ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅? ΠΠΎΠΆΠ½ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΡ ΡΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΠΎΠ³ΠΎ-ΡΠ»Π΅Π½Π° ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π½Π°ΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ Π°Π΄ΡΠ΅ΡΠ° ΠΎΠ±ΡΠ΅ΠΊΡΠ°.
ΠΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ mpi Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ Ρ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠΌ ΠΊΠ»Π°ΡΡΠ°, ΠΊ ΠΊΠΎΡΠΎΡΠΎΠΌΡ ΠΎΠ½Π° ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ. ΠΠ΅ΠΌΠ½ΠΎΠ³ΠΎ Π½ΠΈΠΆΠ΅ Π² ΠΏΡΠΈΠΌΠ΅ΡΠ΅ 15.2 ΡΠ°ΡΠΏΠΎΠ»Π°Π³Π°Π΅ΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ°Ρ ΡΡΡΠΎΠΊΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ mpi Π΄Π»Ρ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΡ ΡΠ΅Π»ΠΎΠ³ΠΎ ΡΠΈΡΠ»Π° Π·Π½Π°ΡΠ΅Π½ΠΈΡ, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΡΡΠ»Π°Π΅ΡΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ mpi.
obj.*mpi = 5;
obj ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠΌ ΠΊΠ»Π°ΡΡΠ° MyClass. Π‘ΡΡΠ»ΠΊΠ° Π½Π° ΡΠ»Π΅Π½ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΠΎΡΠΊΠΈ (ΠΈΠ»ΠΈ ->, Π΅ΡΠ»ΠΈ Ρ Π²Π°Ρ ΠΈΠΌΠ΅Π΅ΡΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° obj) ΠΈ ΡΠ°Π·ΡΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ mpi ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ Π²Π°ΠΌ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΡΡΠ»ΠΊΡ Π½Π° obj.ival_.
Π£ΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ Π½Π° ΡΡΠ½ΠΊΡΠΈΠΈ-ΡΠ»Π΅Π½Ρ Π΄Π΅ΠΉΡΡΠ²ΡΡΡ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ°ΠΊ ΠΆΠ΅. Π ΠΏΡΠΈΠΌΠ΅ΡΠ΅ 15.2 ΠΎΠ±ΡΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΡΠ½ΠΊΡΠΈΡ-ΡΠ»Π΅Π½ MyClass, ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ void ΠΈ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ².
void (MyClass::*mpf)();
ΠΠΌΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΈΡΠ²ΠΎΠΈΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° Π°Π΄ΡΠ΅ΡΠ°ΡΠΈΠΈ.
mpf = &MyClass::incr;
ΠΠ»Ρ Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΈ Π·Π°ΠΊΠ»ΡΡΠΈΡΠ΅ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π² ΡΠΊΠΎΠ±ΠΊΠΈ, ΡΡΠΎΠ±Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΠΏΠΎΠ½ΡΠ» Π²Π°ΡΠΈ Π½Π°ΠΌΠ΅ΡΠ΅Π½ΠΈΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ:
(obj.*mpf)();
ΠΠ΄Π½Π°ΠΊΠΎ ΠΈΠΌΠ΅Π΅ΡΡΡ ΠΎΠ΄Π½ΠΎ ΠΎΡΠ»ΠΈΡΠΈΠ΅ Π² ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ Π½Π° Π΄Π°Π½Π½ΡΠ΅-ΡΠ»Π΅Π½Ρ ΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ Π½Π° ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ»Π΅Π½Ρ. ΠΡΠ»ΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠ±ΡΡΠ½ΡΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ (Π½Π΅ Π½Π° ΡΠ»Π΅Π½ ΠΊΠ»Π°ΡΡΠ°) Π½Π° Π΄Π°Π½Π½ΠΎΠ΅-ΡΠ»Π΅Π½, ΠΏΡΠΎΡΡΠΎ Π΄Π΅ΠΉΡΡΠ²ΡΠΉΡΠ΅ ΠΎΠ±ΡΡΠ½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ.