Вопрос-Ответ (C++)
|
|
Kornival | Дата: Воскресенье, 04 Сентября 2011, 19:10 | Сообщение # 1 |
The Witcher
Сейчас нет на сайте
| Чтобы не создавать отдельную тему на каждый глупый вопрос, предлагаю задавать их здесь.
Saitei: все вопросы по С задаём в теме Вопрос-Ответ (С). Благодарю за внимание!
|
|
| |
GameMix | Дата: Воскресенье, 15 Декабря 2013, 15:01 | Сообщение # 1121 |
старожил
Сейчас нет на сайте
| stalker5889, понял, наверное хд. Спасибо тебе
Steel Standoff - 2D аркада. Мои статьи
|
|
| |
OpenGOO | Дата: Воскресенье, 15 Декабря 2013, 15:25 | Сообщение # 1122 |
почти ветеран
Сейчас нет на сайте
| Цитата stalker5889 ( ) void fn(basic& obj)//тут корень зла { obj.Func(); //к кому обращатся? basic или child }
Здесь как раз все понятно, будет вызвана функция из basic.
Этот вариант демонстрирует всю мощь полиморфизма.
Код void fn(basic* obj) { obj->Func(); )
Мои проекты: - Свободный и открытый клон World Of Goo - TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)
[GameMaker: Studio v1.4.9999]
|
|
| |
stalker5889 | Дата: Воскресенье, 15 Декабря 2013, 15:34 | Сообщение # 1123 |
Свободный игродел
Сейчас нет на сайте
| Цитата OpenGOO ( ) Здесь как раз все понятно, будет вызвана функция из basic. Но ведь child тоже является basic. А у тебя просто ссылочный оператор заменён указателем.
|
|
| |
Izaron | Дата: Воскресенье, 15 Декабря 2013, 19:00 | Сообщение # 1124 |
Rammstein forever
Сейчас нет на сайте
| Сталкер, фигню сказал ваще. В первом случае принимаем только ссылку на basic, во втором - либо его, либо его наследников
|
|
| |
last2424 | Дата: Воскресенье, 15 Декабря 2013, 19:22 | Сообщение # 1125 |
30 мл. блоков
Сейчас нет на сайте
| Появился вопрос. Как сделать следующее: Вызов файла main.cpp из папки scripts. Файл main.cpp должен проигрываться вместе с кодом программы.
Предупреждение: всё что я написал в зачёркнутом виде является шуткой и никак не пытает обидеть того к кому обращаются.(нет)
|
|
| |
Izaron | Дата: Воскресенье, 15 Декабря 2013, 19:47 | Сообщение # 1126 |
Rammstein forever
Сейчас нет на сайте
| last2424, имеешь в виду выполнение скриптов как в юнити или гейммейкере, насколько я понял? Добавлено (15.12.2013, 19:47) --------------------------------------------- Тогда зацени http://habrahabr.ru/post/196272/ Скрипты на С++ обычно не делают
|
|
| |
OpenGOO | Дата: Воскресенье, 15 Декабря 2013, 19:49 | Сообщение # 1127 |
почти ветеран
Сейчас нет на сайте
| Цитата stalker5889 ( ) Но ведь child тоже является basic. А у тебя просто ссылочный оператор заменён указателем. Всё разобрался. Я в первый раз встретил пример где используется ссылка на базовый класс (до этого всегда было преобразование в указатель), а то так бы и думал что надо/можно использовать только указывать на базовый класс -)
Мои проекты: - Свободный и открытый клон World Of Goo - TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)
[GameMaker: Studio v1.4.9999]
|
|
| |
last2424 | Дата: Воскресенье, 15 Декабря 2013, 20:06 | Сообщение # 1128 |
30 мл. блоков
Сейчас нет на сайте
| Izaron, мне надо что бы это было похоже на скрипты так как хочу что бы моя почеркушка была хоть немного похожа на двиг. Но так-как lua знаю это тоже подойдёт.
Предупреждение: всё что я написал в зачёркнутом виде является шуткой и никак не пытает обидеть того к кому обращаются.(нет)
Сообщение отредактировал last2424 - Воскресенье, 15 Декабря 2013, 20:08 |
|
| |
OpenGOO | Дата: Воскресенье, 15 Декабря 2013, 20:47 | Сообщение # 1129 |
почти ветеран
Сейчас нет на сайте
| last2424, если нужен C-подобный синтаксис, то есть такой вариант AngelScript
Мои проекты: - Свободный и открытый клон World Of Goo - TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)
[GameMaker: Studio v1.4.9999]
|
|
| |
stalker5889 | Дата: Понедельник, 16 Декабря 2013, 08:32 | Сообщение # 1130 |
Свободный игродел
Сейчас нет на сайте
| Цитата Izaron ( ) В первом случае принимаем только ссылку на basic Неа. Скомпилируй и посмотри. По ссылке можно передать как базовый класс так и наследника. Мой способ и способ OpenGOO ничем не отличаются кроме удобства вызова.
|
|
| |
Archido | Дата: Понедельник, 16 Декабря 2013, 12:58 | Сообщение # 1131 |
Сэнсэй
Сейчас нет на сайте
| Цитата stalker5889 ( ) По умолчанию C++ не может определить будет вызываться basic или child, так как явно написано: void fn(basic& obj) что подразумевает использование класса basic. Это раннее связывание которое требует меньше ресурсов и оставлено по умолчанию для совместимости с Си. Слово virtual заставляет осуществить позднее связывание то есть подставить в аргумент нужный класс (basic или child) динамически во время выполнения. Не совсем так. Аргумент (тобишь наш класс) всегда передается один и тот же, и компилятору ничего не нужно с этим делать. Для классов с полиморфизмом (где есть virtual) и "обычных" классов вся разница лишь в способе вызова их методов.
Если взять "обычный класс", то код, приведенный выше, будет преобразован компилятором в некий псевдокод: Цитата void fn(basic& obj) { basic::Func(obj); } Т.е. в данном случае (в виду отсутствия полиморфизма) компилятор явно подставит конкретный метод того класса, который указан как тип аргумента fn. И без разницы какой потомок будет передаваться в эту ф-цию, вызываться всегда будет basic::Func.
В случае с полиморфизмом, способ вызова методов совершенно иной: Цитата FuncId = 1; void fn(basic& obj) { obj.vtbl[FuncId]::Func(obj); } Суть в чем. У каждого полиморфного класса есть скрытое поле - vtbl, это указатель на таблицу виртуальных ф-ций конкретного класса. У каждого класса (именно класса, не экземпляра) своя такая таблица, поэтому по ней, зная некий Id ф-ции, можно сделать выборку из таблицы, получить указатель на метод и его вызвать. Поэтому в примере выше, в зависимости от того, что придет в ф-цию fn - класс basic или child, будет произведена выборка из разных таблиц виртуальных ф-ций и как следствие - вызов метода Func() необходимого класса.
Если в классе появляется хоть один виртуальный метод, то этот класс и все его потомки автоматически становятся полиморфными.
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
|
|
| |
vasua99 | Дата: Понедельник, 16 Декабря 2013, 18:52 | Сообщение # 1132 |
GNU follower
Сейчас нет на сайте
| Один вопрос - про поведение ifstream.
Почему такое проходит:
Код cin.get(str, strLength).get();
А такое: Выдает Код error C2228: left of '.get' must have class/struct/union
По идее же в обоих случаях возращается обьект типа ifstream?
Жизнь игра, и мы в ней пешки... А я кушаю пельмешки)
Сообщение отредактировал vasua99 - Понедельник, 16 Декабря 2013, 19:39 |
|
| |
stalker5889 | Дата: Вторник, 17 Декабря 2013, 14:12 | Сообщение # 1133 |
Свободный игродел
Сейчас нет на сайте
| Вопрос по цвету символа и фона в консоли: Как изменить цвет отдельного символа? Можно ли написать так: цвет_символа(RED) цвет_фона(BLUE) cout<<"a"; цвет_символа(WHITE) цвет_фона(BLACK) . ? И как это сделать? Восьмибитной палитры вполне хватит. Использую visual studio.
|
|
| |
Нохчи | Дата: Вторник, 17 Декабря 2013, 14:27 | Сообщение # 1134 |
заслуженный участник
Сейчас нет на сайте
| Погугли SetConsoleTextAttribute. ссылки почему-то не работают.
Многие вопросы по Windows отпадут, если посмотреть тут
Сообщение отредактировал Нохчи - Вторник, 17 Декабря 2013, 14:29 |
|
| |
stalker5889 | Дата: Вторник, 17 Декабря 2013, 15:29 | Сообщение # 1135 |
Свободный игродел
Сейчас нет на сайте
| Цитата Нохчи ( ) Погугли SetConsoleTextAttribute. А как можно использовать другое сочетание цвет/фон в этой функции? Кроме смешивания "на глаз".
|
|
| |
Нохчи | Дата: Вторник, 17 Декабря 2013, 15:41 | Сообщение # 1136 |
заслуженный участник
Сейчас нет на сайте
| Цитата stalker5889 ( ) А как можно использовать другое сочетание цвет/фон в этой функции? Кроме смешивания "на глаз". Не понял что значит "смешивание на глаз". Код int main() { HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | BACKGROUND_RED);
std::cout << "Hello world"; system("pause"); }
Многие вопросы по Windows отпадут, если посмотреть тут
|
|
| |
stalker5889 | Дата: Вторник, 17 Декабря 2013, 15:46 | Сообщение # 1137 |
Свободный игродел
Сейчас нет на сайте
| Цитата Нохчи ( ) Не понял что значит "смешивание на глаз". В справке было указано мало разных цветов. Проблему уже сам решил.
|
|
| |
last2424 | Дата: Вторник, 17 Декабря 2013, 20:42 | Сообщение # 1138 |
30 мл. блоков
Сейчас нет на сайте
| Затрудняюсь с функциями, надо вызвать из другой функций переменную и массив. Как это сделать? С++ только учу.
Предупреждение: всё что я написал в зачёркнутом виде является шуткой и никак не пытает обидеть того к кому обращаются.(нет)
Сообщение отредактировал last2424 - Вторник, 17 Декабря 2013, 20:43 |
|
| |
vasua99 | Дата: Пятница, 20 Декабря 2013, 17:07 | Сообщение # 1139 |
GNU follower
Сейчас нет на сайте
| Эмм... если они как-то связанны, то может создать структуру?
Код ....
struct Struct { int variable; int *array; };
....
Struct * func() { Struct *i = new Struct {}; ... return i; }
... Struct *i = func(); delete i; Добавлено (17.12.2013, 22:19) --------------------------------------------- Как вариант еще передавать указатель на массив в функцию. Менять там его, а возвращать переменную(хотя тут главное не перемудрить, ибо можно "плохой" код получить).
P.S В C# на этот счет есть хорошая штука - спецификатор out. Код void func(out int i) { i = 40; }
...
int variable; func(out variable); Добавлено (20.12.2013, 17:07) --------------------------------------------- Вопрос. Есть кусок кода Код int count = 0; ... average = sum / count;
for (int i = count, count = 0; i >= 0; i--) { ... }
Как заставить считать count не обьявлением еще одной внутренней переменной цикла(которая перекрывает внешнюю, а отдельным присвоением ей нуля.
те Код int i = count, count = 0 должно быть двумя операторами, разделенными запятой, а не одним оператором объявления двух переменных.
Жизнь игра, и мы в ней пешки... А я кушаю пельмешки)
|
|
| |
Destroy | Дата: Воскресенье, 22 Декабря 2013, 17:05 | Сообщение # 1140 |
постоянный участник
Сейчас нет на сайте
| вопрос есть строка с разделителями, надо найти количество слов максимальной длинный например .hello.;lol.works должен вывести 2 подскажите примерный алгоритм
Сообщение отредактировал Destroy - Воскресенье, 22 Декабря 2013, 17:05 |
|
| |