Главная страница Случайная страница Разделы сайта АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
💸 Как сделать бизнес проще, а карман толще?
Тот, кто работает в сфере услуг, знает — без ведения записи клиентов никуда. Мало того, что нужно видеть свое раписание, но и напоминать клиентам о визитах тоже.
Проблема в том, что средняя цена по рынку за такой сервис — 800 руб/мес или почти 15 000 руб за год. И это минимальный функционал.
Нашли самый бюджетный и оптимальный вариант: сервис VisitTime.⚡️ Для новых пользователей первый месяц бесплатно. А далее 290 руб/мес, это в 3 раза дешевле аналогов. За эту цену доступен весь функционал: напоминание о визитах, чаевые, предоплаты, общение с клиентами, переносы записей и так далее. ✅ Уйма гибких настроек, которые помогут вам зарабатывать больше и забыть про чувство «что-то мне нужно было сделать». Сомневаетесь? нажмите на текст, запустите чат-бота и убедитесь во всем сами! Листинг 18.3. Функция-друг, не являющаяся шаблоном
1: // Листинг 19.3. Использование в шаблонах функций-друзей определенного типа 2: 3: #include < iostream.h> 4: 5: const int DefaultSize = 10; 6: 7: // обьявляем простой класс Animal, чтобы можно 8: // было создать массив животных 9: 10: class Animal 11: { 12: public: 13: Animal(int); 14: Animal(); 15: ~Animal() { } 16: int GetWeight() const { return itsWeight; } 17: void Display() const { cout < < itsWeight; > 18: private: 19: int itsWeight; 20: }; 21: 22: Animal:: Animal(intweight): 23: itsWeight(weight) 24: { } 25: 26: Animal:: Animal(): 27: itsWeight(0) 28: { } 29: 30: template < class T> // обьявляем шаблон и параметр 31: class Array // параметризованный класс 32: { 33: public: 34: // конструкторы 35: Array(int itsSize = DefaultSize); 36: Array(const Array & rhs); 37: ~Array() { delete [] pType; } 38: 39: // операторы 40: Array& operator=(const Array&); 41; T& operator[](int offSet) { return pType[offSet]; } 42: const T& operator[](int offSet) const 43: { return pType[offSet]; } 44: // методы доступа 45: int GetSize() const { return itsSize; } 46: 47: // функция-друг 48: friend void Intrude(Array< int>); 50: private: 51: T *рТуре; 52: int itsSize; 53: }; 54: 55: // Поскольку функция-друг не является шаблоном, ее можно использовать только 56: // с массивами целых чисел! Но она получает доступ к закрытым данным класса. 57: void Intrude(Array< int> theArray) 58: { 59: cout < < " \n*** Intrude ***\n"; 60: for (int i = 0; i < theArray.itsSize; i++) 61: cout < < " i: " < < theArray.pType[i] < < endl; 62: cout < < " \n" 63: } 64: 65: // Ряд выполнений... 66: 67: // выполнение конструктора 68: template < class T> 69: Array< T>:: Array(int size): 70: itsSize(size) 71: { 72: pType = new T[size]; 73: for (int i = 0; i< size; i++) 74: pType[i] = 0; 75: } 76: 77: // конструктор-копировщик 78: template < class T> 79: Array< T>:: Array(const Array & rhs) 80: { 81: itsSize = rhs.GetSize(); 82: pType = new T[itsSize]; 83: for (int i = 0; i< itsSize; i++) 84: pType[i] = rhs[i]; 85: } 86: 87: // перегрузка оператора присваивания (=) 88: template < class T> 89: Array< T> & Array< T>:: operator=(const Array & rhs) 90: { 91: if (this == & rhs) 92: return *this; 93: delete [] pType; 94: itsSize = rhs.GetSize(); 95: pType = new T[itsSize]; 96: for (int i = 0; i< itsSize; i++) 97: pType[i] = rhs[i]; 98: return *this; 99: } 100: 101: // управляющая программа 102: int main() 103: { 104: Array< int> theArray; // массив целых 105: Array< Animal> theZoo; // массив животных 106: Animal *pAnimal; 107: 108: // заполняем массивы 109: for (int i = 0; i < theArray.GetSize(); i++) 110: { 111: theArray[i] = i*2; 112: pAnimal = new Animal(i*3); 113: theZoo[i] = *pAnimal; 114: } 115: 116: int j; 117: for (j = 0; j < theArray.GetSize(); j++) 118: { 119: cout < < " theZoo[" < < j < < " ]: \t"; 120: theZoo[j].Display(); 121: cout < < endl; 122: } 123: cout < < " Now use the friend function to"; 124: cout < < " find the members of Array< int> "; 125: Intrude(theArray); 126: 127: cout < < " \n\nDone.\n"; 128: return 0; 129: }
Результат: theZoo[0]: 0 theZoo[1]: 3 theZoo[2]: 6 theZoo[3]: 9 theZoo[4]: 12 theZoo[5]: 15 theZoo[6]: 18 theZoo[7]: 21 theZoo[8]: 24 theZoo[9]: 27 Now use the friend function to find the members of Array< int> *** Intrude *** i: 0 i: 2 i: 4 i: 6 i: 8 i: 10 i: 12 i: 14 i: 16 i: 18 Done.
Анализ: Объявление шаблона Array было расширено за счет включения дружественной функции Intrude(). Это объявление означает, что каждый экземпляр массива типа int будет считать функцию Intrude() дружественной, а следовательно, она будет иметь доступ к закрытым переменным-членам и функциям-членам экземпляра этого массива. В строке 60 функция lntrude() непосредственно обращается к члену itsSize, а в строке 61 получает прямой доступ к переменной-члену pType. В данном случае без использования функции-друга можно было бы обойтись, поскольку класс Array предоставляет открытые методы доступа к этим данным. Этот листинг служит лишь примером того, как можно объявлять и использовать функции-друзья шаблонов.
|