Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.11.2017, 21:10   #1
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию Динамический массив объектов класса, C++

Здравствуйте.
Мне тут пришлось покодить на плюсах (задача такая), и нужно организовать динамический массив объектов собственного класса.
Я забыл, как я это делал раньше (там был какой-то серьёзный колхозинг). Пришёл сюда. Можете напомнить пожалуйста ?
Класс, объекты которого нужно завернуть в массив - игроки в моей игрульке, их может быть от 1 до 4. Можно использовать и статический массив, но "так не интересно", к тому же колода карт (36 ИЛИ 54) диктует уже именно эти условия.

Как организовать ?
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 23.11.2017, 22:01   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

std::vector<MyClass>, std::vector<std::shared_ptr<MyClass >>, ...
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 23.11.2017, 22:51   #3
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Разобрался со звёздочками ...
Код:
class Lol
{
	/* bla-bla-bla */
};

Lol **arr;

int main()
{
	int n;
	cin>>n;
	arr=new Lol*[n];
	arr[100500]=new Lol(/* параметры */);
}
Вроде даже компилируется. Правда требует конструктор "по умолчанию", т. е. без параметров.

Сейчас у меня другая проблема назревает:
логика предполагает, что объекты должны знать друг о друге, а если класс объявлен ниже, чем то место, в котором его пытаешься использовать - начинаются проблемы с компиляцией. Как решать ?
Помню в делфи был такой прикол с функциями, просто заголовок функции нужно было разместить в блоке объявления всех методов и полей класса.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 23.11.2017, 23:00   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

И зачем спрашивали если продолжаете использовать свой
Цитата:
Сообщение от OmegaBerkut Посмотреть сообщение
серьёзный колхозинг
?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 24.11.2017, 01:04   #5
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
зачем спрашивали если продолжаете использовать свой
Затем, что я забыл, как меня учили.
Вспомнил.
Сейчас другая проблема ...

Цитата:
Сообщение от OmegaBerkut Посмотреть сообщение
объекты должны знать друг о друге, а если класс объявлен ниже, чем то место, в котором его пытаешься использовать - начинаются проблемы с компиляцией. Как решать ?
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 24.11.2017, 01:42   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

гугл - forward declaration c++
p51x вне форума Ответить с цитированием
Старый 24.11.2017, 07:13   #7
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Я столкнулся с двумя интересными (для меня) ошибками ...
1 - C2227, описание по ссылке мало меня касается, ибо у меня классы, а там структура, и у меня нет никаких наружных объявлений, через которые я пытаюсь пролезть к тем функциям, которых там заведомо нет.
2 - C2027, описание ещё тупее - сверху деклалирован класс C, нужная функция находится в классе D. Понятно, что если я за нужной функцией (которая в классе D) пойду в класс C - то у меня буду проблемы.

Но у меня класс деклалирован под тем же именем, которое указано непосредственно перед телом класса.
Погуглил - везде советуют сделать декларацию классов. Сделал, толку никакого.

Код:
ref class Game_Player; // это типа декларация

/* ... тут много говнокода ... */

ref class Game_Table // это игровой стол, а не таблица (в инглише это одно и тоже, судя по переводчику)
{
	/* ... */
	private: List<Game_Player^> ^players;

	private: void New_Game()
	{
		// в цикле
			players[index]->TakeCard(/* заранее согласованый объект карты */);
	}

	/* ... */
}

ref class Game_Player
{
	/* здесь тоже есть обращения к классу Game_Player, но он уже сверху, и тут проблем нет (пока что, самый не проработанный класс =) ) */
	public: void TakeCard(/* здесь мне нужно эту карту принять со стола */)
	{
		// бла-бла-бла
	}
	/* ... */
}
Ругается на подчёркнутый вызов. Дело не в массиве, я проверил. Декларацию пытался разместить где только можно, ну не хочет он работать.
Я долго ковыряю это дело; без верхней декларации любые упоминания самого типа (Game_Player) выше описания класса - компилятор уходил в осадок. Добавил эту делкарацию - стало всё нормально. Сейчас смотрю - обижается на попытки обратиться к экземпляру класса (как по методам, так и по полям).

Ошибки
использование неопределённого типа "Game_Core::Game_Player" - как мне помочь ему определить этот тип, при том, что он сам же пишет, что тип <ТАКОЙ ТО> не определён.
выражение слева от "-> чего нибудь" должно указывать на тип класса, структуры, или объединения либо на универсальный тип - что сделать, что бы указывало ?
Подпись ? Не, не слышал ...

Последний раз редактировалось OmegaBerkut; 24.11.2017 в 07:43.
OmegaBerkut вне форума Ответить с цитированием
Старый 24.11.2017, 07:33   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

1. это не С++, а С++ CLI
2. Game_Player и GamePlayer это разные вещи
3. List<GamePlayer^> - это не массив и работать с ним надо соответственно
p51x вне форума Ответить с цитированием
Старый 24.11.2017, 07:45   #9
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
2. Game_Player и GamePlayer это разные вещи
Это я здесь ошибку допустил. В коде правильно, сюда же перекатывал и очищал для всеобщей читаемости, исправил.
Цитата:
Сообщение от p51x Посмотреть сообщение
3. List<GamePlayer^> - это не массив
Цитата:
Сообщение от OmegaBerkut Посмотреть сообщение
Дело не в массиве, я проверил
Цитата:
Сообщение от p51x Посмотреть сообщение
1. это не С++, а С++ CLI
На CLI я был вынужден перекатится из-за некоторых требований. До введения картинок (Image ^) был чистый C++, со ссылочными (*) массивами.

UPD: только что перепроверил, переделал на players=gcnew array<Game_Player^>(players_count);
То есть - обычный массив. Ничего не поменялось. В прочем - и не могло ничего поменяться, просто потому что при объявлении обычного дескриптора (Game_Player ^ololo=gcnew Game_Player();) при попытке обратиться туда за полями или методами - ситуация не меняется. Класс описан сверху заголовком. Тело класса находится в самом низу кода. Что тут не так ?
Если надо - могу скинуть весь файл (игровая логика отдельным модулем).
Подпись ? Не, не слышал ...

Последний раз редактировалось OmegaBerkut; 24.11.2017 в 07:58.
OmegaBerkut вне форума Ответить с цитированием
Старый 24.11.2017, 10:17   #10
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Я избавился от ошибки ... (но не решил её)
Так как декларация всех классов вначале ничего не давала - я пересортировал порядок классов "снизу-вверх" в порядке использования-вызова "сверху-вниз" в самих функциях (эт наверное сложна).
И у меня появилось две декларации.

Дальше философия ...
Я таким занимался на делфях, но на шарпе таких проблем не было. На плюсах оказалось по строже (но я и не удивлён особо).
Единственная причина моих издевательств над собой же (и в каком то смысле над вами) - это желание сделать так, что бы было как можно меньше дополнительных деклараций =). С моей предыдущей последовательностью вроде бы можно было сделать всего одну декларацию. Но причина ошибки мне неизвестна, так как не помогала даже декларация всех классов.
Подпись ? Не, не слышал ...

Последний раз редактировалось OmegaBerkut; 24.11.2017 в 10:54.
OmegaBerkut вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Шаблонный массив объектов класса - C++ Андрей Иванов Помощь студентам 2 01.10.2015 17:07
Массив объектов класса. zipwind Общие вопросы C/C++ 8 01.05.2011 20:56
динамический массив объектов класса. С++ Шиншилка Помощь студентам 8 25.04.2011 17:58
Динамический массив класса Array emnm Общие вопросы C/C++ 0 21.12.2010 22:04
2-мерный динамический массив экземпляров класса. С++ Парсифаль Общие вопросы C/C++ 1 29.12.2009 14:35