Вопрос-Ответ (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; } Прошу помощи
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];
Вот эта строка вообще ненужна
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 |
постоянный участник
Сейчас нет на сайте
| нельзя сделать постепенно выделяемый массив. В некоторых случаях это аппаратно невозможно. Так что я вижу единственный вариант решения проблемы - тот, который я описал выше.
|
|
| |
|