Главная страница Случайная страница Разделы сайта АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
💸 Как сделать бизнес проще, а карман толще?
Тот, кто работает в сфере услуг, знает — без ведения записи клиентов никуда. Мало того, что нужно видеть свое раписание, но и напоминать клиентам о визитах тоже.
Проблема в том, что средняя цена по рынку за такой сервис — 800 руб/мес или почти 15 000 руб за год. И это минимальный функционал.
Нашли самый бюджетный и оптимальный вариант: сервис VisitTime.⚡️ Для новых пользователей первый месяц бесплатно. А далее 290 руб/мес, это в 3 раза дешевле аналогов. За эту цену доступен весь функционал: напоминание о визитах, чаевые, предоплаты, общение с клиентами, переносы записей и так далее. ✅ Уйма гибких настроек, которые помогут вам зарабатывать больше и забыть про чувство «что-то мне нужно было сделать». Сомневаетесь? нажмите на текст, запустите чат-бота и убедитесь во всем сами! Листинг 6.5. Пример нарушения соглашений интерфейса
1: // Пример ошибки компиляции, связанной 2: // с нарушениями соглашений интерфейса класса 3: 4: #include < iostream.h> // для объекта cout 5: 6: class Cat 7: { 8: public: 9: Cat(int initialAge); 10: ~Cat(); 11: int GetAge() const; // метод доступа const 12: void SetAge (int age); 13: void Meow(); 14: private: 15: int itsAge; 16: }; 17: 18: // конструктор класса Cat 19: Cat:: Cat(int initialAge) 20: { 21: itsAge = initialAge; 22: cout < < " Cat constructor\n"; 23: } 24: Cat:: ~Cat() // деструктор, который не выполняет никаких действий 25: { 26: cout < < " Cat destructor\n"; 27: } 28: // функция GetAge объявлена как const, 29: // но мы нарушаем это условие! 30: int Cat:: GetAge() const 31: { 32: return (itsAge++); // это нарушение соглашения интерфейса! 33: } 34: 35: // определение функции SetAge как открытого 36: // метода доступа к данным класса 37: 38: void Cat:: SetAge(int age) 39: { 40: // присваиваем переменной-члену itsAge 41: // значение переданного парйметра age 42: itsAge = age; 43: } 44: 45: // Определение метода Meow 46: // возвращает void 47: // параметров нет 48: // используется для вывода на экран текста " Meow" 49: void Cat:: Meow() 50: { 51: cout < < " Meow.\n"; 52: } 53: 54: // демонстрирует различные нарушения 55: // интерфейса, что приводит к ошибкам компиляции 56: int main() 57: { 58: Cat Frisky; // не соответствует обьявлению 59: Frisky.Meow(); 60: Frisky.Bark(); // Нет, кошки не лают. 61: Frisky.itsAge = 7; // переменная itsAge закрыта 62: return 0; 63: }
Анализ: Как упоминалось выше, эта программа не компилируется. Поэтому и отсутствуют результаты ее работы. Эту программу было забавно писать, поскольку в нее специально закладывались ошибки. В строке 11 GetAge()объявляется как функция доступа к данным-членам класса без права их изменения, на что указывает спецификатор const. Однако в теле функции GetAge(), а именно в строке 32, выполняется приращение переменной-члена itsAge. А поскольку этот метод объявлен как const, он не имеет права изменять значение переменной itsAge. Следовательно, во время компиляции программы на этой строке будет зафиксирована ошибка. В строке 13 объявляется метод Meow(), в этот раз без использования ключевого слова const. И хотя такое упущение не является ошибкой, это далеко не лучший стиль программирования. Если учесть, что этот метод не должен изменять значения переменных-членов класса Cat, то его следовало бы определить со спецификатором const. В строке 58 показано определение объекта класса Cat с именем Frisky. В этом варианте программы класс Cat имеет конструктор, который принимает в качестве параметра целочисленное значение. Это означает обязательность передачи параметра заданного типа. Поскольку в строке 58 никакой параметр не передается, компилятор зафиксирует ошибку.
Примечание: Если в классе объявляется какой-либо конструктор, компилятор в этом случае не станет предлагать со своей стороны никакого другого конструктора даже если определение объекта по форме не будет coответствовать объявленному конструктору. В подобных случаях компилятор покажет сообщение об ошибке.
В строке 60 вызывается метод Bark(). Этот метод вообще не был объявлен, следовательно, ни о каком его использовании и речи быть не может. В строке 61 делается попытка присвоить переменной itsAge значение 7. Поскольку переменная itsAge относится к числу закрытых данных-членов, то при компиляции программы здесь будет зафиксировано покушение на частную собственность класса.
|