Пятница, 19 Апреля 2024, 21:31

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
Форум игроделов » Программирование » C/C++ » Вопрос-Ответ (C++) (Вопросы по С++ задаём здесь.)
Вопрос-Ответ (C++)
KornivalДата: Воскресенье, 04 Сентября 2011, 19:10 | Сообщение # 1
The Witcher
Сейчас нет на сайте
Чтобы не создавать отдельную тему на каждый глупый вопрос, предлагаю задавать их здесь.

Saitei: все вопросы по С задаём в теме Вопрос-Ответ (С). Благодарю за внимание!
GameMixДата: Воскресенье, 15 Декабря 2013, 15:01 | Сообщение # 1121
старожил
Сейчас нет на сайте
stalker5889, понял, наверное хд. Спасибо тебе smile

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/
Скрипты на С++ обычно не делают smile

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();


А такое:
Код

cin.get().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
Форум игроделов » Программирование » C/C++ » Вопрос-Ответ (C++) (Вопросы по С++ задаём здесь.)
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг