Перейти в начало страницы

Здравствуйте, гость ( Авторизация | Регистрация )

Gameru.net останавливает работу в связи с вторжением армии РФ в Украину. Следите за дальнейшими анонсами.
Support Gameru!
38 страниц V  « < 35 36 37 38 >  
Ответить в данную темуНачать новую тему
> Учим языки программирования, Помогаем друг-другу, делимся опытом.
Shoкer
сообщение 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


--------------------
Мне просто нравятся синие буквы под сообщением.
Перейти в начало страницы
 
HikeR
сообщение 30.05.2015, 06:44
Сообщение #722


Магистр Игры
****************

Репутация:   270  
Группа: Участник
Сообщений: 2620
Награды: 4
Регистрация: 26.03.2007




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(Shoкer @ 30.05.2015, 02:49) *
Это нужно исключительно для того, чтобы защитить себя от ошибок.

можно заюзать спецификатор delete из C++11, то есть явно запретить конструктор копирования. при обращении к запрещенному методу возникнет ошибка на этапе компиляции, однако нельзя будет создавать и указатели на такие методы.

или стырить из boost-а "class noncopyable".
Перейти в начало страницы
 
Cossack-HD
сообщение 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
Перейти в начало страницы
 
RedMagic
сообщение 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);
}


--------------------
Перейти в начало страницы
 
Cossack-HD
сообщение 01.06.2015, 20:40
Сообщение #725


TECHNOSLAV 80 уровня
**********************

Репутация:   379  
Группа: Участник
Сообщений: 5758
Награды: 6
Регистрация: 26.01.2014




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(STALKER2011x @ 01.06.2015, 21:18) *
Cossack-HD,

Код
static char MinusOne(char c)
{
     return (char)(Convert.ToInt32(c) - 1);
}

Спасибо! Но как бы после этого действия обратно в стандартный char перегнать? Я просто впервые занимаюсь с преобразованиями char sad.gif
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
Перейти в начало страницы
 
RedMagic
сообщение 02.06.2015, 07:52
Сообщение #726


Высший Игровой Бог
************************

Репутация:   1747  
Группа: Супермодератор
Сообщений: 12594
Награды: 15
Регистрация: 05.11.2009




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(Cossack-HD @ 01.06.2015, 20:35) *
Спасибо! Но как бы после этого действия обратно в стандартный char перегнать? Я просто впервые занимаюсь с преобразованиями char

Код
char b = 'B';
char a = MinusOne(b);

Цитата(Cossack-HD @ 01.06.2015, 20:35) *
EDIT: функция возвращает знаки вопроса,
if (symbol < 65)
return (char)65;

В этом случае, конечно, всегда получается A. Даже если на входе в MinusOne(char symb) symb == Z. Значит, функция возвращает значения ниже 65?

Таблица char символов


--------------------
Перейти в начало страницы
 
Молния в вакууме
сообщение 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;
    }
}

Вопрос в чём.. Почему не обращаются к элементам класса напрямую, а городят функции для этого? Это же медленнее, и вообще, зачем?
Перейти в начало страницы
 
Tron
сообщение 23.09.2015, 01:57
Сообщение #728


Игровой Эксперт
***************

Репутация:   407  
Группа: Участник
Сообщений: 2394
Награды: 5
Регистрация: 19.01.2009




Вставить ник Цитировать выделенное в форуму быстрого ответа


Отнюдь не всегда надо иметь возможность менять поля, и везде.
Гораздо проще поставить бряк на функцию, чем искать где эта переменная меняется в коде - проще отдебажить.

Заинлайнь эти функции, и разницы ты не ощутишь.
Перейти в начало страницы
 
RayTwitty
сообщение 23.09.2015, 02:43
Сообщение #729


Игровой Бог
**********************

Репутация:   648  
Группа: Участник
Сообщений: 5354
Награды: 9
Регистрация: 24.09.2010




Вставить ник Цитировать выделенное в форуму быстрого ответа


saas, иногда, когда необходимо только получать значение из внешних интерфейсов - вводят геттер, а сама переменная остается без возможности изменения из вне.

А если есть сеттер... То скорее всего да, в первую очередь для дебага - ведь изменение переменной может быть не одно в коде, а заюзав функцию, можно однозначно сказать, когда было произведено изменение, поставив бряк в одном месте.

Сообщение отредактировал RayTwitty - 23.09.2015, 02:49


--------------------
Перейти в начало страницы
 
jamakasi
сообщение 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
Перейти в начало страницы
 
RedMagic
сообщение 23.09.2015, 09:55
Сообщение #731


Высший Игровой Бог
************************

Репутация:   1747  
Группа: Супермодератор
Сообщений: 12594
Награды: 15
Регистрация: 05.11.2009




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(saas @ 23.09.2015, 00:52) *
Вопрос в чём.. Почему не обращаются к элементам класса напрямую, а городят функции для этого? Это же медленнее, и вообще, зачем?

Потому что предоставлять прямой доступ к элементам не есть хорошо. Ведь тогда их можно изменить откуда угодно. Да и иногда требуется делать проверки прежде чем записать значение.
Гугли "методы доступа". Конкретно в этом случае - геттеры и сеттеры.
И вообще: Инкапсуляция Полиморфизим Наследование. Эти три слова которые обязаны знать все хорошие программисты.
PS: Почитать об этом можно, например, тут: Я не знаю ООП
PSS: По поводу скорости работы - эти операции не настолько медленные что на них стоит обращать внимание.


--------------------
Перейти в начало страницы
 
abramcumner
сообщение 23.09.2015, 11:47
Сообщение #732


Игровое Воплощение
*********************

Репутация:   394  
Группа: Участник
Сообщений: 4791
Награды: 4
Регистрация: 27.04.2011




Вставить ник Цитировать выделенное в форуму быстрого ответа


saas, если ты видишь в коде тривиальные сеттеры/геттеры, знай - у автора ооп головного мозга.

Цитата
Потому что предоставлять прямой доступ к элементам не есть хорошо.

Тривиальные сеттеры и геттеры именно это и делают.

95% сеттеров должно быть заменено нормальными методами с именами, говорящими о том что они делают, а не как.
95% геттеров должно быть удалено.
Перейти в начало страницы
 
umad
сообщение 23.09.2015, 11:51
Сообщение #733


Продвинутый геймер
********

Репутация:   33  
Группа: Участник
Сообщений: 251
Награды: 2
Регистрация: 03.04.2014




Вставить ник Цитировать выделенное в форуму быстрого ответа


Господа, какую можете посоветовать полезную литературу по Lua для новичков? Желательно на русском, но не обязательно.
Перейти в начало страницы
 
abramcumner
сообщение 23.09.2015, 11:59
Сообщение #734


Игровое Воплощение
*********************

Репутация:   394  
Группа: Участник
Сообщений: 4791
Награды: 4
Регистрация: 27.04.2011




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(umad @ 23.09.2015, 11:46) *
Господа, какую можете посоветовать полезную литературу по Lua для новичков? Желательно на русском, но не обязательно.

На русском по луа вроде только одна книга.
Луа он же простой - за глаза хватит официальной документации. Для 5.1 раньше была и на русском, а теперь куда-то пропала.

Сообщение отредактировал abramcumner - 23.09.2015, 12:00
Перейти в начало страницы
 
Gaara
сообщение 23.09.2015, 12:43
Сообщение #735


Продвинутый геймер
********

Репутация:   188  
Группа: Участник
Сообщений: 318
Награды: 2
Регистрация: 15.02.2015




Вставить ник Цитировать выделенное в форуму быстрого ответа


Какой язык программирования самый легкий и доступный для само-изучения человеку, который совсем в этом ничего не понимает? На досуге бы занялся саморазвитием smile.gif


--------------------
Перейти в начало страницы
 
Молния в вакууме
сообщение 23.09.2015, 13:05
Сообщение #736


Почти Игроман
*********

Репутация:   187  
Группа: Участник
Сообщений: 647
Награды: 4
Регистрация: 05.05.2007




Вставить ник Цитировать выделенное в форуму быстрого ответа


Tron, RayTwitty, jamakasi, STALKER2011x, abramcumner, спасибо за разъяснения.
Я когда-то начинал учить С++, но как-то уполз в сторону чистого С, и поэтому в ООП плохо разбираюсь.

Если для дебага, тогда понятно.
Перейти в начало страницы
 
User_X.A.R26
сообщение 23.09.2015, 14:11
Сообщение #737


Геймер
******

Репутация:   15  
Группа: Участник
Сообщений: 137
Награды: 2
Регистрация: 11.01.2014




Вставить ник Цитировать выделенное в форуму быстрого ответа


Veter, Visual Basic, который .NET
Перейти в начало страницы
 
jamakasi
сообщение 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 скрипты из большой явы). Код читаем всегда и от любого рукожопа даже, куча стандартов, очень лаконичен и понятен, когда пишешь программу решаешь только реальные задачи логики в программе а не то что откуда скачать это или это, потом как этим пользоваться и вообще почему оно неработает даже в примерах. Проще говоря для себя я нашел оптимальный вариант т.к. кросплатформа на все, софт хоть графика хоть консоль или вообще на сервера, кроме того можно писать однопоточный код а потом очень легко его распаралелить , есть свой гипер удобный скриптовый язык(да это плевок в сторону луа!, тут есть ооп, вызов классов из программы без изначального внедрения их в движок да еще и синтаксис привычный), можно писать сайты(хотя это для первого взгляда извращение smile.gif но на самом деле опять же удобно когда разберешься), продолжать можно еще очень долго.

Цитата(abramcumner @ 23.09.2015, 11:42) *
saas, если ты видишь в коде тривиальные сеттеры/геттеры, знай - у автора ооп головного мозга.

Цитата
Потому что предоставлять прямой доступ к элементам не есть хорошо.

Тривиальные сеттеры и геттеры именно это и делают.

95% сеттеров должно быть заменено нормальными методами с именами, говорящими о том что они делают, а не как.
95% геттеров должно быть удалено.

По крайней мере с геттерами и сеттерами я уверен что некто не повалит мою библиотеку прямым обращением к переменным, без них ищи свищи какой поток и какая функция валится при каких либо обстоятельствах. Кроме того если я беру чужой класс я сразу вижу и понимаю что getName всегда вернет нужный мне тип а setName всегда примет опять же правильный тип данных и все это в савокупности облегчит мне жизнь т.к. все возможные исключения и полиморфы уже где то в недрах чужого класса и я вообще могу не заглядывать в него т.к. оно просто работает.
Перейти в начало страницы
 
RedMagic
сообщение 23.09.2015, 15:34
Сообщение #739


Высший Игровой Бог
************************

Репутация:   1747  
Группа: Супермодератор
Сообщений: 12594
Награды: 15
Регистрация: 05.11.2009




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(User_X.A.R26 @ 23.09.2015, 14:06) *
Veter, Visual Basic, который .NET

Зачем советовать старье которое сейчас почти никто не использует?
Veter, изучай основы C/C++, а потом переползай на C# (может можно и сразу с него начать, я учил сначала C/C++). Он относительно простой и понятный. Да и потом его уже можно будет применять в реальных ситуациях. Могу еще Java посоветовать, на уровне вхождения он где-то на одном месте с C#.


--------------------
Перейти в начало страницы
 
Neo][
сообщение 23.09.2015, 15:45
Сообщение #740


The One
****************

Репутация:   744  
Группа: Участник
Сообщений: 2715
Награды: 5
Регистрация: 05.12.2005




Вставить ник Цитировать выделенное в форуму быстрого ответа


Цитата(abramcumner @ 23.09.2015, 13:42) *
saas, если ты видишь в коде тривиальные сеттеры/геттеры, знай - у автора ооп головного мозга.

abramcumner, справедливо только в контексте лабораторных wink.gif

Цитата(STALKER2011x @ 23.09.2015, 17:29) *
Могу еще Java посоветовать, на уровне вхождения он где-то на одном месте с C#.

STALKER2011x, ИМХО c# попроще будет, т.к. всё заводится из коробки, с Java возможны варианты под виндой...

Veter, смотря для чего тебе это, если просто побаловаться с алгоритмами или мелкие полезняшки для себя клепать, то я бы смотрел в сторону скриптовых языков(тот же PowerShell)


--------------------
Перейти в начало страницы
 

38 страниц V  « < 35 36 37 38 >
Ответить в данную темуНачать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 02.05.2024, 22:40