Учим языки программирования, Помогаем друг-другу, делимся опытом. |
Здравствуйте, гость ( Авторизация | Регистрация )
Учим языки программирования, Помогаем друг-другу, делимся опытом. |
30.05.2015, 02:54
Сообщение
#721
|
|
Кандидат Игровых Наук Репутация: 2153 Группа: Участник Сообщений: 3488 Награды: 4 Регистрация: 27.07.2009 |
Вопрос по С++, может немного странный. Есть базовый класс и наследник от него. Необходимо запретить вызов функций базового класса из наследника любыми способами кроме как через указатель на базовый класс.
Нечто вроде: Код class A { public: void Test() {...}; }; class B : public A { B() { Test(); \\-> Запретить this->Test(); \\-> Запретить ((A*)this)->Test(); \\-> Разрешить } }; Это нужно исключительно для того, чтобы защитить себя от ошибок. Грубо говоря у меня класс B работает с другими классами (С,D,E...), которые тоже наследуются от A. При этом класс B оперирует данными класса A, и данные он берёт либо из объектов других классов, либо из себя самого. Возможно ли такое в С++? (компилятор от Visual Studio) Какой нибудь вариант через дружественные классы или типа того. Можно менять модификаторы доступа, главное чтобы цель была достигнута. Сообщение отредактировал Shoкer - 30.05.2015, 03:02 -------------------- Мне просто нравятся синие буквы под сообщением.
|
 
|
|
|
|
30.05.2015, 06:44
Сообщение
#722
|
|
Магистр Игры Репутация: 270 Группа: Участник Сообщений: 2620 Награды: 4 Регистрация: 26.03.2007 |
Это нужно исключительно для того, чтобы защитить себя от ошибок. можно заюзать спецификатор delete из C++11, то есть явно запретить конструктор копирования. при обращении к запрещенному методу возникнет ошибка на этапе компиляции, однако нельзя будет создавать и указатели на такие методы. или стырить из boost-а "class noncopyable". |
 
|
|
01.06.2015, 19:49
Сообщение
#723
|
|
TECHNOSLAV 80 уровня Репутация: 379 Группа: Участник Сообщений: 5758 Награды: 6 Регистрация: 26.01.2014 |
C#
Есть char symbol со значением, например, B. Надо вычести из char symbol "единицу" и получить A. Аналогично Z->Y, Y-> X, etc. Пролазил гугль, ничего толкового не нашёл. Примерный вид функции: static char minusone(char in) { newsymb = in-1; return newsymb; } Разумеется, студия ругается на незаконное совокупление "char" с "int". Сообщение отредактировал Cossack-HD - 01.06.2015, 20:24 -------------------- Ryzen 3700X
Arctic Freezer 33 eSports Duo 16GB DDR4 3600MHz Strix GTX 1080 TI |
 
|
|
01.06.2015, 20:23
Сообщение
#724
|
|
Высший Игровой Бог Репутация: 1747 Группа: Супермодератор Сообщений: 12594 Награды: 15 Регистрация: 05.11.2009 |
Cossack-HD,
Код static char MinusOne(char c)
{ return (char)(Convert.ToInt32(c) - 1); } -------------------- |
 
|
|
01.06.2015, 20:40
Сообщение
#725
|
|
TECHNOSLAV 80 уровня Репутация: 379 Группа: Участник Сообщений: 5758 Награды: 6 Регистрация: 26.01.2014 |
Cossack-HD, Код static char MinusOne(char c) { return (char)(Convert.ToInt32(c) - 1); } Спасибо! Но как бы после этого действия обратно в стандартный char перегнать? Я просто впервые занимаюсь с преобразованиями char EDIT: функция возвращает знаки вопроса, if (symbol < 65) return (char)65; В этом случае, конечно, всегда получается A. Даже если на входе в MinusOne(char symb) symb == Z. Значит, функция возвращает значения ниже 65? Сообщение отредактировал Cossack-HD - 01.06.2015, 20:48 -------------------- Ryzen 3700X
Arctic Freezer 33 eSports Duo 16GB DDR4 3600MHz Strix GTX 1080 TI |
 
|
|
02.06.2015, 07:52
Сообщение
#726
|
|
Высший Игровой Бог Репутация: 1747 Группа: Супермодератор Сообщений: 12594 Награды: 15 Регистрация: 05.11.2009 |
Спасибо! Но как бы после этого действия обратно в стандартный char перегнать? Я просто впервые занимаюсь с преобразованиями char Код char b = 'B'; char a = MinusOne(b); EDIT: функция возвращает знаки вопроса, if (symbol < 65) return (char)65; В этом случае, конечно, всегда получается A. Даже если на входе в MinusOne(char symb) symb == Z. Значит, функция возвращает значения ниже 65? -------------------- |
 
|
|
23.09.2015, 00:57
Сообщение
#727
|
|
Почти Игроман Репутация: 187 Группа: Участник Сообщений: 647 Награды: 4 Регистрация: 05.05.2007 |
У меня тут вопросец..
Очень часто натыкаюсь на что-то типа вот такого: Код class Class { private: int num; public: void SetNum(int _num) { num = _num; } int GetNum() { return num; } } Вопрос в чём.. Почему не обращаются к элементам класса напрямую, а городят функции для этого? Это же медленнее, и вообще, зачем? |
 
|
|
23.09.2015, 01:57
Сообщение
#728
|
|
Игровой Эксперт Репутация: 407 Группа: Участник Сообщений: 2394 Награды: 5 Регистрация: 19.01.2009 |
Отнюдь не всегда надо иметь возможность менять поля, и везде.
Гораздо проще поставить бряк на функцию, чем искать где эта переменная меняется в коде - проще отдебажить. Заинлайнь эти функции, и разницы ты не ощутишь. |
 
|
|
23.09.2015, 02:43
Сообщение
#729
|
|
Игровой Бог Репутация: 648 Группа: Участник Сообщений: 5354 Награды: 9 Регистрация: 24.09.2010 |
saas, иногда, когда необходимо только получать значение из внешних интерфейсов - вводят геттер, а сама переменная остается без возможности изменения из вне.
А если есть сеттер... То скорее всего да, в первую очередь для дебага - ведь изменение переменной может быть не одно в коде, а заюзав функцию, можно однозначно сказать, когда было произведено изменение, поставив бряк в одном месте. Сообщение отредактировал RayTwitty - 23.09.2015, 02:49 -------------------- |
 
|
|
23.09.2015, 09:25
Сообщение
#730
|
|
Доктор Игровых Наук Репутация: 544 Группа: Участник Сообщений: 3657 Награды: 9 Регистрация: 12.07.2007 |
saas, я так понимаю что ты учишь с++ а в нем не особо заботятся о читабельности кода.
На примере джавы такой класс выглядит и называется как PoJo. Существенные плюсы такого подхода: *Код в разы легче читать даже если писал его не ты. *PoJo подход класса гарантирует что класс вполне себе самостоятелен(как правило объявляются конструкторы с параметрами и без+ обязательно все подводные камни обрабатываются в методах геттеров и сеттеров). *Явная,легкая возможность для реализации многопоточности(намного проще делать определенные методы,как правило сеттеры, типом synchronized что дает гарантию исключения ошибки при вызове этого метода из разных потоков). *В конце концов воспринимается такой код проще, примером ниже покажу. *Такие PoJo классы сильно разгружают восприятие основной логики программы. *По своей сути такой класс является черным ящиком, ты можешь абсолютно не знать что творится в нем но всегда сможешь его приминить т.к. ты явно видишь что он принимает и что дает в итоге и при этом ты как правило не беспокоишься о переводе типов данных и обработке исключений. * Из такого класса очень легко сгенерировать документацию. * Облегчение дебага и исправления багов. Пример. Есть некий класс описывающий и реализующий объект. И основной код программы который категорически не нужно захламлять лишним кодом не относящимся к бизнеслогике. Пусть будет класс описывающий работу с БД. Пример абстрактен. Сам класс: Код импорты\инклуды необходимых классов class SQLBD{ SQLBD(void){ подключение к бд со стандарным логином и паролем } SQLBD(String login,password){ подключение к бд с login и password} } Кучи геттеров и сеттеров в которых описаны все исключения и типы данных Теперь ты можешь сделать точно такой же класс с такими же названиями геттеров и сеттеров(в яве обычно используют интефейс для таких дел в с++ не знаю) В коде ты или другой человек который вообще не имеет представления о бд берет твои классы и просто визуально и понятно его задействет. получается что то типа такого: SQLBD bd = new SQLBD(); bd.setName(Любые данные); MONGOBD bd1 = new MONGOBD(); bd1.seName(Любые данные); Сообщение отредактировал jamakasi - 23.09.2015, 09:43 |
 
|
|
23.09.2015, 09:55
Сообщение
#731
|
|
Высший Игровой Бог Репутация: 1747 Группа: Супермодератор Сообщений: 12594 Награды: 15 Регистрация: 05.11.2009 |
Вопрос в чём.. Почему не обращаются к элементам класса напрямую, а городят функции для этого? Это же медленнее, и вообще, зачем? Потому что предоставлять прямой доступ к элементам не есть хорошо. Ведь тогда их можно изменить откуда угодно. Да и иногда требуется делать проверки прежде чем записать значение. Гугли "методы доступа". Конкретно в этом случае - И вообще: Инкапсуляция Полиморфизим Наследование. Эти три слова которые обязаны знать все хорошие программисты. PS: Почитать об этом можно, например, тут: PSS: По поводу скорости работы - эти операции не настолько медленные что на них стоит обращать внимание. -------------------- |
 
|
|
23.09.2015, 11:47
Сообщение
#732
|
|
Игровое Воплощение Репутация: 394 Группа: Участник Сообщений: 4791 Награды: 4 Регистрация: 27.04.2011 |
saas, если ты видишь в коде тривиальные сеттеры/геттеры, знай - у автора ооп головного мозга.
Цитата Потому что предоставлять прямой доступ к элементам не есть хорошо. Тривиальные сеттеры и геттеры именно это и делают. 95% сеттеров должно быть заменено нормальными методами с именами, говорящими о том что они делают, а не как. 95% геттеров должно быть удалено. |
 
|
|
23.09.2015, 11:51
Сообщение
#733
|
|
Продвинутый геймер Репутация: 33 Группа: Участник Сообщений: 251 Награды: 2 Регистрация: 03.04.2014 |
Господа, какую можете посоветовать полезную литературу по Lua для новичков? Желательно на русском, но не обязательно.
|
 
|
|
23.09.2015, 11:59
Сообщение
#734
|
|
Игровое Воплощение Репутация: 394 Группа: Участник Сообщений: 4791 Награды: 4 Регистрация: 27.04.2011 |
Господа, какую можете посоветовать полезную литературу по Lua для новичков? Желательно на русском, но не обязательно. На русском по луа вроде только одна Луа он же простой - за глаза хватит Сообщение отредактировал abramcumner - 23.09.2015, 12:00 |
 
|
|
23.09.2015, 12:43
Сообщение
#735
|
|
Продвинутый геймер Репутация: 188 Группа: Участник Сообщений: 318 Награды: 2 Регистрация: 15.02.2015 |
Какой язык программирования самый легкий и доступный для само-изучения человеку, который совсем в этом ничего не понимает? На досуге бы занялся саморазвитием
-------------------- |
 
|
|
23.09.2015, 13:05
Сообщение
#736
|
|
Почти Игроман Репутация: 187 Группа: Участник Сообщений: 647 Награды: 4 Регистрация: 05.05.2007 |
Tron, RayTwitty, jamakasi, STALKER2011x, abramcumner, спасибо за разъяснения.
Я когда-то начинал учить С++, но как-то уполз в сторону чистого С, и поэтому в ООП плохо разбираюсь. Если для дебага, тогда понятно. |
 
|
|
23.09.2015, 14:11
Сообщение
#737
|
|
Геймер Репутация: 15 Группа: Участник Сообщений: 137 Награды: 2 Регистрация: 11.01.2014 |
Veter, Visual Basic, который .NET
|
 
|
|
23.09.2015, 15:01
Сообщение
#738
|
|
Доктор Игровых Наук Репутация: 544 Группа: Участник Сообщений: 3657 Награды: 9 Регистрация: 12.07.2007 |
Veter, Python, google GO, так же добавил бы сюда джаву т.к. она очень многое прощает и многое не допускает еще в самой IDE.
Короче если хочется что то простое для себя чтобы потом автоматизировать мелкие задачки то питон или го а если что то чуть серьезднее то ява. Мнение сугубо мое т.к. изучал многие языки в той или иной степени(по хронологии: basic->pascal->делфи->c++ билдер->visual c++ ->C ->питон->сейчас джава+иногда почитываю о ГО и вспоминаю питон), запомнились так что с++билдер почти равен делфям которые в свою очередь наследники паскаля и который очень простой(код не лаконичен, слабо читаем, чужой код читать вообще ад но зато очень удобно писать что то мелкое особенно графическое). visual c++ и С нечто непонятное в нынешнем времени т.к. мелкомягкие очень сильно задушили его своими разновидностями .net языков(С#,basic.net и др.) поэтому я практически не успел его приминить и в случае необходимости написание чего то нативного пользуюсь билдером, в общем лично мне с++ от мелкомягких сильно не понравился. Java+(nashorn-скриптовый язык JS который очень легко использовать в системе без прибегания к джаве большой или наоборот очень легко вынести часть логики программы в js скрипты из большой явы). Код читаем всегда и от любого рукожопа даже, куча стандартов, очень лаконичен и понятен, когда пишешь программу решаешь только реальные задачи логики в программе а не то что откуда скачать это или это, потом как этим пользоваться и вообще почему оно неработает даже в примерах. Проще говоря для себя я нашел оптимальный вариант т.к. кросплатформа на все, софт хоть графика хоть консоль или вообще на сервера, кроме того можно писать однопоточный код а потом очень легко его распаралелить , есть свой гипер удобный скриптовый язык(да это плевок в сторону луа!, тут есть ооп, вызов классов из программы без изначального внедрения их в движок да еще и синтаксис привычный), можно писать сайты(хотя это для первого взгляда извращение но на самом деле опять же удобно когда разберешься), продолжать можно еще очень долго. saas, если ты видишь в коде тривиальные сеттеры/геттеры, знай - у автора ооп головного мозга. Цитата Потому что предоставлять прямой доступ к элементам не есть хорошо. Тривиальные сеттеры и геттеры именно это и делают. 95% сеттеров должно быть заменено нормальными методами с именами, говорящими о том что они делают, а не как. 95% геттеров должно быть удалено. По крайней мере с геттерами и сеттерами я уверен что некто не повалит мою библиотеку прямым обращением к переменным, без них ищи свищи какой поток и какая функция валится при каких либо обстоятельствах. Кроме того если я беру чужой класс я сразу вижу и понимаю что getName всегда вернет нужный мне тип а setName всегда примет опять же правильный тип данных и все это в савокупности облегчит мне жизнь т.к. все возможные исключения и полиморфы уже где то в недрах чужого класса и я вообще могу не заглядывать в него т.к. оно просто работает. |
 
|
|
23.09.2015, 15:34
Сообщение
#739
|
|
Высший Игровой Бог Репутация: 1747 Группа: Супермодератор Сообщений: 12594 Награды: 15 Регистрация: 05.11.2009 |
Veter, Visual Basic, который .NET Зачем советовать старье которое сейчас почти никто не использует? Veter, изучай основы C/C++, а потом переползай на C# (может можно и сразу с него начать, я учил сначала C/C++). Он относительно простой и понятный. Да и потом его уже можно будет применять в реальных ситуациях. Могу еще Java посоветовать, на уровне вхождения он где-то на одном месте с C#. -------------------- |
 
|
|
23.09.2015, 15:45
Сообщение
#740
|
|
The One Репутация: 744 Группа: Участник Сообщений: 2715 Награды: 5 Регистрация: 05.12.2005 |
saas, если ты видишь в коде тривиальные сеттеры/геттеры, знай - у автора ооп головного мозга. abramcumner, справедливо только в контексте лабораторных Могу еще Java посоветовать, на уровне вхождения он где-то на одном месте с C#. STALKER2011x, ИМХО c# попроще будет, т.к. всё заводится из коробки, с Java возможны варианты под виндой... Veter, смотря для чего тебе это, если просто побаловаться с алгоритмами или мелкие полезняшки для себя клепать, то я бы смотрел в сторону скриптовых языков(тот же PowerShell) -------------------- |
 
|
|
Текстовая версия | Сейчас: 02.05.2024, 22:40 |