Пятница, 22 Ноября 2024, 19:23

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

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

Saitei: все вопросы по С задаём в теме Вопрос-Ответ (С). Благодарю за внимание!
goldsphereДата: Суббота, 19 Апреля 2014, 11:43 | Сообщение # 1241
заслуженный участник
Сейчас нет на сайте
bool ClassName::isTrue(){}

FinderX - Android Аркада
danielskachkovДата: Суббота, 19 Апреля 2014, 12:04 | Сообщение # 1242
постоянный участник
Сейчас нет на сайте
И еще одно, с Вашего позволения. Правда ли, что тип функции virtual нужно указывать только в h-файле? То есть в h-файле я пишу: virtual bool isTrue(), а в срр-файле: bool ClassName::isTrue() {...}.

Из-за преступной халатности работников Эрмитажа картина Казимира Малевича "Черный квадрат" два месяца провисела вверх ногами.
goldsphereДата: Суббота, 19 Апреля 2014, 12:17 | Сообщение # 1243
заслуженный участник
Сейчас нет на сайте
danielskachkov, да
А в чём проблема проверить? Или хотя бы прочитать немного об этом?


FinderX - Android Аркада

Сообщение отредактировал goldsphere - Суббота, 19 Апреля 2014, 12:18
danielskachkovДата: Суббота, 19 Апреля 2014, 13:41 | Сообщение # 1244
постоянный участник
Сейчас нет на сайте

Добавлено (19.04.2014, 13:41)
---------------------------------------------
В чем смысл этого выражения:
IDFlag_IsPickable = 1 << 0
Никак не возьму в толк. Ведь если я все правильно понял, 1 << 0 == 1 * 2^0, то есть 1 * 1 (так как 2 в нулевой степени равняется 1).


Из-за преступной халатности работников Эрмитажа картина Казимира Малевича "Черный квадрат" два месяца провисела вверх ногами.
OpenGOOДата: Суббота, 19 Апреля 2014, 14:20 | Сообщение # 1245
почти ветеран
Сейчас нет на сайте
Цитата danielskachkov ()
И еще одно, с Вашего позволения. Правда ли, что тип функции virtual нужно указывать только в h-файле? То есть в h-файле я пишу: virtual bool isTrue(), а в срр-файле: bool ClassName::isTrue() {...}.


Когда ты пишешь так:

foo.h

Код
#pragma once

class Foo
{
public:
    virtual bool isTrue();
}


foo.cpp

Код
#include "foo.h"

bool Foo::isTrue() {...}


то конечный код после работы препроцессора становится вот таким

foo.cpp

Код
class Foo
{
public:
    virtual bool isTrue();
}

bool Foo::isTrue() {...}


Мои проекты:
- Свободный и открытый клон World Of Goo
- TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)

[GameMaker: Studio v1.4.9999]


Сообщение отредактировал OpenGOO - Суббота, 19 Апреля 2014, 14:23
-l33t-h4xx-Дата: Суббота, 19 Апреля 2014, 15:22 | Сообщение # 1246
участник
Сейчас нет на сайте
Цитата danielskachkov ()
IDFlag_IsPickable = 1 << 0

Выражение действительно не имеет смысла с точки зрения программы, скорее всего это напоминание для программиста, что нулевой бит некой переменной является флажком, отвечающим за свойство IsPickable. Не удивлюсь, если там рядом есть и такие определения:
Код
const int IDFlag_IsPickable = 1 << 0;
const int IDFlag_IsPackable = 1 << 1;
const int IDFlag_IsPokable = 1 << 2;
const int IDFlag_IsWhateverYouWant = 1 << 3;


Как правильно задавать вопросы

Сообщение отредактировал -l33t-h4xx- - Суббота, 19 Апреля 2014, 15:27
danielskachkovДата: Суббота, 19 Апреля 2014, 21:38 | Сообщение # 1247
постоянный участник
Сейчас нет на сайте
Прошу прощения за назойливость, хочу уж сразу добить все неясности. Насколько я понял, все сторонние "инклуды" следует подключать в .h-файле, а в .срр только сам .h-файл класса. По крайней мере, подобная конструкция вполне работает. И еще. Я где-то читал (на одном из форумов), что все заголовочные файлы, подключаемые выше заголовочного файла нашего класса, автоматически подключаются и к нему. Пример:
Код
#include <iostream>
#include <vector>
#include <...>
#include "MyClass.h"

Действительно ли все эти библиотеки будут подключены к моему классу? В моем коде это почему-то не работало.


Из-за преступной халатности работников Эрмитажа картина Казимира Малевича "Черный квадрат" два месяца провисела вверх ногами.
-l33t-h4xx-Дата: Воскресенье, 20 Апреля 2014, 14:17 | Сообщение # 1248
участник
Сейчас нет на сайте
Цитата danielskachkov ()
Насколько я понял, все сторонние "инклуды" следует подключать в .h-файле,

Лучше всё же обойтись только теми заголовочниками, без которых класс не будет работать. Это, помимо всего прочего, документирует зависимости, в будущем ты будешь ценить такую возможность: программы станут большими, лишние инклуды неизбежно вызовут головную боль.

Насчёт инклуда вообще: директива #include "имя-файла" только и делает, что вставляет на место себя содержимое указанного файла, никакие библиотеки он на самом деле не подключает. Советую почитать на темы "компиляция" и "препроцессор", большинство вопросов отпадёт (хотя бы здесь и здесь).


Как правильно задавать вопросы

Сообщение отредактировал -l33t-h4xx- - Воскресенье, 20 Апреля 2014, 14:23
goldsphereДата: Воскресенье, 20 Апреля 2014, 15:49 | Сообщение # 1249
заслуженный участник
Сейчас нет на сайте
danielskachkov, смотри, ты подключаешь либы в то место где они тебе нужны, если ты хочешь в объявлении класса их использовать то да, подключаешь туда, например
#include <vector>

class A{
std::vector<Objects> vec;
}

если там они тебе не нужны, а нужны только в теле методов класса, то лучше подключать к cpp файлу. Бывают ситуации, когда происходит зацикливание подключений.


FinderX - Android Аркада

Сообщение отредактировал goldsphere - Воскресенье, 20 Апреля 2014, 15:49
-l33t-h4xx-Дата: Понедельник, 21 Апреля 2014, 11:46 | Сообщение # 1250
участник
Сейчас нет на сайте
Цитата goldsphere ()
Бывают ситуации, когда происходит зацикливание подключений.

Это когда? Мне правда интересно, я с таким не сталкивался (если ты не о забытой ifndef-защите, конечно).


Как правильно задавать вопросы
OpenGOOДата: Понедельник, 21 Апреля 2014, 13:45 | Сообщение # 1251
почти ветеран
Сейчас нет на сайте
Может имелся в виду этот случай

foo.h

Код
#ifndef FOO_H
#define FOO_H

#include "bar.h"

class Foo
{
       public:
           Foo(Bar *bar)
           {
               _bar = bar;
               _bar->setFoo(this);
           }
           virtual ~Foo() {}

       private:
           Bar* _bar;
};

#endif // FOO_H


bar.h

Код
#ifndef BAR_H
#define BAR_H

#include "foo.h"

class Bar
{
       public:
           virtual ~Bar() {}

           void setFoo(Foo *foo) { _foo = foo; }

       private:
           Foo* _foo;
};

#endif // BAR_H


Мои проекты:
- Свободный и открытый клон World Of Goo
- TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)

[GameMaker: Studio v1.4.9999]


Сообщение отредактировал OpenGOO - Понедельник, 21 Апреля 2014, 16:45
GameMixДата: Воскресенье, 11 Мая 2014, 18:46 | Сообщение # 1252
старожил
Сейчас нет на сайте
Здравствуйте! С постепенным выделением памяти с помощью new и без встроенных структур данных C++ почти разобрался. Программа теперь не вылетает, но при определенном количестве динамически добавленных элементов в массив вывод их значений на экран перестаёт работать.
Вот код:
Код
#include <iostream>
using namespace std;

int main()
{
int *a = new int;
int i = 0, count, number;

do
   {
    cin >> number;
    if (number == 0) continue;
    a[i] = *new int;
    a[i] = number;
    i ++;
   }
while (number != 0);

count = i;

for (i = 0; i < count; i ++) cout << a[i] << ' ';

return 0;
}

Прошу помощи smile


Steel Standoff - 2D аркада.
Мои статьи
SaiteiДата: Воскресенье, 11 Мая 2014, 21:19 | Сообщение # 1253
старожил
Сейчас нет на сайте
GameMix,
Код
int *a = new int;
int i = 0, count, number = 0;

do
    {
     number++;
     if (number == 100500) continue;
     a[i] = *new int;
     a[i] = number;
     i ++;
    }
while (number != 100500);

Попробовал искусственно создать 100500 элементов и столкнулся с ошибкой памяти. Скорее всего происходит работа с теми участками из программной кучи, которые не зарегистрировались.

И, насколько я знаю, чтобы добавить новый элемент в динамичееский массив Q, надо создать второй массив и скопировать туда массив, потом для Q выделить память на единицу больше, чем раньше, скопировать со второго массива и в самый конец засунуть новый элемент. По крайней мере так я понимаю работу того же std::vector. Могу ошибаться
OpenGOOДата: Понедельник, 12 Мая 2014, 00:25 | Сообщение # 1254
почти ветеран
Сейчас нет на сайте
Сперва надо создать массив, например на 256 элементов
Код
int *a = new int[256];


Вот эта строка вообще ненужна
Код
a[i] = *new int;


GameMix, ты вообще по какой книге язык изучаешь?

Что ты этим
Код
if (number == 0) continue;
хотел добиться?

Если не понимаешь как работает код, то делай трассировку.


Мои проекты:
- Свободный и открытый клон World Of Goo
- TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)

[GameMaker: Studio v1.4.9999]
Storm54Дата: Понедельник, 12 Мая 2014, 00:29 | Сообщение # 1255
постоянный участник
Сейчас нет на сайте
Цитата
И, насколько я знаю, чтобы добавить новый элемент в динамичееский массив Q, надо создать второй массив и скопировать туда массив, потом для Q выделить память на единицу больше, чем раньше, скопировать со второго массива и в самый конец засунуть новый элемент. По крайней мере так я понимаю работу того же std::vector. Могу ошибаться

Никогда не смотрел исходники стандартных контейнеров, но что-то мне подсказывает, что там каждый объект представляет из себя структуру, похожую на эту:

Код

struct Object
{
   T current;
   Object* next;
};


Получается, что каждая структура помимо своего объекта содержит еще и указатель на структуру следующего объекта. Соответственно структура, содержащая нулевой указатель на следующую структуру, является последним элементом в последовательности.
При таком подходе никакого массива не требуется, а добавление нового элемента осуществляется в пару действий.


Сообщение отредактировал Storm54 - Понедельник, 12 Мая 2014, 00:30
OpenGOOДата: Понедельник, 12 Мая 2014, 01:20 | Сообщение # 1256
почти ветеран
Сейчас нет на сайте
Кто-то не знает чем массив отличается от списка

Мои проекты:
- Свободный и открытый клон World Of Goo
- TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)

[GameMaker: Studio v1.4.9999]
goldsphereДата: Понедельник, 12 Мая 2014, 07:18 | Сообщение # 1257
заслуженный участник
Сейчас нет на сайте
OpenGOO, массив это просто набор не связанных между собой элементов. Всё что можно делать с массивом это получить элемент по индексу. Список - это класс, где каждый элементы между собой связаны, указывают друг на друга. В списке нельзя получить доступ к элементу по индексу, доступ к элементам может быть только последовательным

FinderX - Android Аркада
GameMixДата: Понедельник, 12 Мая 2014, 07:45 | Сообщение # 1258
старожил
Сейчас нет на сайте
Цитата OpenGOO ()
int *a = new int[256];

OpenGOO, здесь больше, чем 256 элементов в массив не запишешь. А мне нужно создать своего рода самописный вектор. Кто-то скажет, что я мастерю "очередной велосипед"... Да, пусть велосипед, но хочется решить такую задачку без стандартных структур данных:

Пользователь вводит по одному числу до тех пор, пока не введёт число 0. 0 означает завершение ввода чисел в массив. Так вот, если юзер не поленится и введёт более 256 чисел, то дальше запись пойдёт фиг знает в какие адреса, и работать с теми числами будет, как минимум, проблематично.

Storm54, интересный вариант, попробую сделать так. Но всё равно странно, ведь с массивом тоже можно было бы сделать около 1000 постепенно выделяемых ячеек памяти под элементы массива.


Steel Standoff - 2D аркада.
Мои статьи
last2424Дата: Понедельник, 12 Мая 2014, 07:48 | Сообщение # 1259
30 мл. блоков
Сейчас нет на сайте
GameMix, а обнулять при определённом количестве не пробовал?

Предупреждение: всё что я написал в зачёркнутом виде является шуткой и никак не пытает обидеть того к кому обращаются.(нет)
Storm54Дата: Понедельник, 12 Мая 2014, 07:59 | Сообщение # 1260
постоянный участник
Сейчас нет на сайте
нельзя сделать постепенно выделяемый массив. В некоторых случаях это аппаратно невозможно. Так что я вижу единственный вариант решения проблемы - тот, который я описал выше.
Поиск:

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