Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/55: Рейтинг темы: голосов - 55, средняя оценка - 4.62
 Аватар для Sinkha
3 / 3 / 2
Регистрация: 04.07.2015
Сообщений: 187

Использование объектов класса в другом классе

25.10.2016, 21:27. Показов 10971. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пусть имеются 2 класса Snake и Food, а также 2 их объекта snake и food соответственно. food должен в одном из его методов работать со snake, а именно с координатами всех его точек. Вопрос, как в методе food работать с классом Snake, если объекты которого не передавать в качестве аргументов?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.10.2016, 21:27
Ответы с готовыми решениями:

Использование класса в другом классе
Мне нужно, чтобы при создании объекта класса Object также создавался объект класса SimpleCollider, но в том объекте. Далее я хочу...

Классы (Использование функций класса в другом классе)
Доброго времени суток. У меня есть 3 класса: Forest, Plants и Grass. Хочу сделать, чтобы через указатель на объект класса Forest я мог...

Использование данных одного класса в другом классе
Подскажите как сделать так что бы значения d1,d2 из первого класса можно было использовать во втором классе? #include...

19
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
25.10.2016, 21:36
Цитата Сообщение от Sinkha Посмотреть сообщение
имеются 2 класса Snake и Food
ошибка проектирования.

Цитата Сообщение от Sinkha Посмотреть сообщение
food должен в одном из его методов работать со snake
ошибка проектирования.

Цитата Сообщение от Sinkha Посмотреть сообщение
как в методе food работать с классом Snake, если объекты которого не передавать в качестве аргументов?
есть два способа передать знание об объектах:

1.
передача этого знания с помощью аргументов функций

2.
объект может быть глобальным.
и тогда к нему можно будет получить доступ из любой точки программы.
0
Модератор
Эксперт С++
 Аватар для zss
13772 / 10965 / 6491
Регистрация: 18.12.2011
Сообщений: 29,242
25.10.2016, 21:36
А включения не достаточно?
C++
1
2
3
4
5
6
7
8
9
10
11
12
class Food
{
private:
   Snake snake;
    ...
public:
   void f()
   {
        snake.size=0;
   }
...
};
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
25.10.2016, 21:37
Цитата Сообщение от zss Посмотреть сообщение
А включения не достаточно?
еда включает в себя змею?
змея - это часть еды, так вы подумали?
1
56 / 56 / 31
Регистрация: 24.10.2016
Сообщений: 186
25.10.2016, 21:40
Я думаю правильным подходом будет сделать класс Snake синглтоном (объект один же в программе я так понял)
И далее в Food использовать Snake::getInstance()
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
25.10.2016, 21:44
Цитата Сообщение от OlafNestandart Посмотреть сообщение
Я думаю правильным подходом будет сделать класс Snake синглтоном (объект один же в программе я так понял)
нет логических ограничений.
ничто не мешает сделать 2-3 змеи, и тд.

здесь нет причин для сингелтона.

Цитата Сообщение от OlafNestandart Посмотреть сообщение
И далее в Food использовать Snake::getInstance()
считаете, что еда сама должна кормить собой змею?
или все таки это змея кушает еду?
1
56 / 56 / 31
Регистрация: 24.10.2016
Сообщений: 186
25.10.2016, 22:02
Цитата Сообщение от hoggy Посмотреть сообщение
нет логических ограничений.
ничто не мешает сделать 2-3 змеи, и тд.
Ничто не мешает, но очевидно же что ТС пишет простую змейку, в которой как известно змейка всего одна.
Цитата Сообщение от hoggy Посмотреть сообщение
считаете, что еда сама должна кормить собой змею?
или все таки это змея кушает еду?
ТС не спрашивал правильную ли он архитектуру применяет, а вот именно на поставленный им вопрос я дал один из верных ответов.
0
 Аватар для Sinkha
3 / 3 / 2
Регистрация: 04.07.2015
Сообщений: 187
25.10.2016, 22:15  [ТС]
Простите, а что такое синглтон и как его сделать?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
25.10.2016, 23:07
Цитата Сообщение от hoggy Посмотреть сообщение
считаете, что еда сама должна кормить собой змею?
Исходя из вопроса:
Цитата Сообщение от Sinkha Посмотреть сообщение
Вопрос, как в методе food работать с классом Snake, если объекты которого не передавать в качестве аргументов?
других предположений не возникает.
Вполне может быть, что пища - активный объект действа.
Например, она может перевариваясь и покидая змею с противоположного конца, придавать последней импульс. Еда сама знает свою калорийность, количество и ей от змеи нужна только протяженность и сечение проточной части. И змее не нужно знать, о том, что она там съела, даже. Что бы не расстраиваться. Особенно, учитывая современные пищевые технологии.
То есть, еда рассчитав импульс передаёт его змее, змея рассчитывает звуковые эффекты, количество частиц, волновые процессы по туловищу. Скорость центра масс позволяет рассчитать его координату.
А если змеек две, то ясно, что им не стоит встречаться на скамейке под луной. На сытый желудок.
0
25.10.2016, 23:23

Не по теме:

Цитата Сообщение от OlafNestandart Посмотреть сообщение
Ничто не мешает, но очевидно же что ТС пишет простую змейку, в которой как известно змейка всего одна.
Почему же, я писал мультиплеерную змейку в день перед отпуском и встроенную как посхалка. :D

0
56 / 56 / 31
Регистрация: 24.10.2016
Сообщений: 186
25.10.2016, 23:29
Цитата Сообщение от Sinkha Посмотреть сообщение
Простите, а что такое синглтон и как его сделать?
Общий вид такой:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// h файл
class Snake {
public:
    static Snake* getInstance();
private:
    static Snake* instance;
}
 
// cpp файл
Snake* Snake::instance = nullptr;
 
Snake* Snake::getInstance() {
    if (instance == nullptr)
        instance = new Snake;
    return instance;
}
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
25.10.2016, 23:39
Цитата Сообщение от Sinkha Посмотреть сообщение
Пусть имеются 2 класса Snake и Food, а также 2 их объекта snake и food соответственно. food должен в одном из его методов работать со snake, а именно с координатами всех его точек. Вопрос, как в методе food работать с классом Snake, если объекты которого не передавать в качестве аргументов?
Мне кажется, вы изначально выбрали неправильную модель, так что нет смысла ее обсуждать, а надо перепроектировать классы.
0
 Аватар для Sinkha
3 / 3 / 2
Регистрация: 04.07.2015
Сообщений: 187
26.10.2016, 02:30  [ТС]
Цитата Сообщение от Mr.X Посмотреть сообщение
Мне кажется, вы изначально выбрали неправильную модель, так что нет смысла ее обсуждать, а надо перепроектировать классы.
Помогите мне с проектировкой пожалуйста. Сам только учусь и вижу некие трудности уже на таком простом этапе.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
26.10.2016, 08:45
Цитата Сообщение от Sinkha Посмотреть сообщение
Сам только учусь и вижу некие трудности уже на таком простом этапе.
Это не простой этап. Проектирование это этап требующий опыта и терпения.
Sinkha, еда, действительно может включать змею. Всё зависит от решаемой задачи. Расскажите как взаимодействуют объекты, нарисуйте схему, чтобы было понятно о чём речь. Это и Вам будет не вредно. Легче будет понять и задачу и советы. А советы легче будет изложить. Потому что общение на данный предмет будет идти в терминах состояний/(значений свойств) и поведения/(работы методов), где важно взаимодействие объектов двух классов.
1
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
26.10.2016, 08:46
Цитата Сообщение от Sinkha Посмотреть сообщение
Помогите мне с проектировкой пожалуйста.
А сценарий игры какой?
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
26.10.2016, 09:24
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
 
struct Coord
{
    int x, y;
};
 
bool operator==(const Coord &lhs, const Coord &rhs)
{
    return lhs.x == rhs.x && lhs.y == rhs.y;
}
 
class Food
{
public:
    Food(const Coord &c) : m_coord(c) {}
    Coord getCoord() const { return m_coord; }
 
protected:
    Coord m_coord;
};
 
class Snake
{
public:
    Snake(const Coord &c) : m_coord(c) {}
    bool canEatFood(const Food &f) const { return m_coord == f.getCoord(); }
    void moveLeft()  { m_coord.x--; }
    void moveRight() { m_coord.x++; }
    void moveUp()    { m_coord.y--; }
    void moveDown()  { m_coord.y++; }
 
protected:
    Coord m_coord; // правильно было бы держать набор координат со всем телом змеи, но у нас показательный пример
};
 
int main()
{
    Snake sn({3, 3});
    Food fd({2, 4});
    sn.moveLeft();
    sn.moveDown();
    if (sn.canEatFood(fd))
        std::cout << "Om-nom-nom\n";
}
0
 Аватар для Sinkha
3 / 3 / 2
Регистрация: 04.07.2015
Сообщений: 187
27.10.2016, 16:01  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
Это не простой этап. Проектирование это этап требующий опыта и терпения.
Sinkha, еда, действительно может включать змею. Всё зависит от решаемой задачи. Расскажите как взаимодействуют объекты, нарисуйте схему, чтобы было понятно о чём речь. Это и Вам будет не вредно. Легче будет понять и задачу и советы. А советы легче будет изложить. Потому что общение на данный предмет будет идти в терминах состояний/(значений свойств) и поведения/(работы методов), где важно взаимодействие объектов двух классов.
Понятно. Я выложил свой исходный код тут https://github.com/ubelian/glg... ter/glgame , так как на сайте есть предел символов которые можно отправить за раз. Игра называется "Змейка". Имеются 3 класса: Snake, Food и CurrentPosition. Snake определен в Snake.h, Food в Food.h, CurretnPosition в tools.h. CurrentPosition это всего напросто класс который задаёт координаты того или иного элемента, например координаты тела змеи или еды. Объекты классов Snake, Food единичные, создаются 1 раз и все. Моя проблема в том, что я не понимаю как классу Food получить доступ к объекту класса Snake. Очень надеюсь что кто-то тыкнет мне в ошибку проектирования.
ЗЫ Использую библиотеку OpenGL, хотя наверное это не важно, так как тут проблема с классами
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
27.10.2016, 17:50
Цитата Сообщение от Sinkha Посмотреть сообщение
Понятно. Я выложил свой исходный код тут
Sinkha, схема и словесное принципиальное описание (сюжет если хотите, как сказал Mr.X, ) тем и хороша, что не нужно смотреть простыни кода. Описав ситуацию, - показываете в чём трудность и участники смогут помочь.
Сразу, по ходу, хочу спросить. Я заглянул в хедер змеи и удивился. Зачем там хедер Тооls? Для объявления указателей достаточно предваряющего объявления class CurrentPosition;
а CurrentPosition getHeadCP(); и CurrentPosition getTailCP(int a); могли бы указатели возвращать. А инклудить хедер можно в cpp-щник змеи если он там нужен. Тогда легче, не получая двойных объявлений, связывать разные модули.
Потому, что так и с другими классами можно поступить. Tools например тоже можно познакомить со змеёй (предварительно объявив) и включив её в Cpp. Профит: они смогуь работать друг с другом не мешая.
Если змея одна Вы можете объявить экземпляр в хедере. Хоть за фигурной скобкой класса. Если хотите поковыряться одним классом в другом, - объявите дружбу. Хотя я бы так не делал, если этого можно избежать.
Имхо, объясните на примере 2-х -3-х простых классов, что не получается.
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
27.10.2016, 18:13
Цитата Сообщение от Sinkha Посмотреть сообщение
Я выложил свой исходный код
Цитата Сообщение от Sinkha Посмотреть сообщение
Очень надеюсь что кто-то тыкнет мне в ошибку проектирования.
Sinkha, чтобы проектировать, нужен не чей-то код, а сценарий игры, т.е. подробное описание что она делает.
0
 Аватар для Sinkha
3 / 3 / 2
Регистрация: 04.07.2015
Сообщений: 187
29.10.2016, 14:03  [ТС]
Игра называется "Змейка". Создаётся змейка, которая имеет размер, по умолчанию он равен 3. Начальный координаты статичны. Также в случайной области создаётся еда, координаты которой всегда случайны. Задача в том, что когда голова змеи совпадает с координатами еды, змея съедает еду и размер змеи увеличивается на 1. После этого задаются случайные координаты новой еды и так далее. ПРоигрыш происходит когда змея съедает саму себя(свой хвост) или змея заходит за область игры(за карту). Еда не может появится там, где сейчас змея, то есть в момент появления координаты еды не могут быть равными координате любой части змеи. Вроде все. В общем игра повторяет ту самую snake на телефонах.

Добавлено через 22 часа 20 минут
+++

Добавлено через 21 час 3 минуты
Цитата Сообщение от IGPIGP Посмотреть сообщение
Sinkha, схема и словесное принципиальное описание (сюжет если хотите, как сказал Mr.X, ) тем и хороша, что не нужно смотреть простыни кода. Описав ситуацию, - показываете в чём трудность и участники смогут помочь.
Сразу, по ходу, хочу спросить. Я заглянул в хедер змеи и удивился. Зачем там хедер Тооls? Для объявления указателей достаточно предваряющего объявления class CurrentPosition;
ПРосто если не включать хедеры таким образом то ничего не работает
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.10.2016, 14:03
Помогаю со студенческими работами здесь

Массив объектов класса в другом классе (композиция). Компилятор ругается на конструктор
Суть задания: есть 1 класс надо создать 2-ой класс для работы с коллецией 1-го. 1&gt;main.obj : error LNK2019: ссылка на неразрешенный...

Как объявить массив объектов одного класса в другом классе, а затем поместить в него объекты?
Как объявить массив объектов одного класса в другом классе, а затем поместить в него объекты?

Объект класса в другом классе
Здравствуйте! Недавно начал учить классы, прошу помогите мне. Мой написанный код не работает. Можете сказать, что с ним не так? ...

Создание класса в другом классе
Приветствую всех. Уважаемые гуру, скажите можно ли создавать класс в теле друго класса? Причем создание &quot;внутреннего&quot; класса идет...

Массив элементов класса в другом классе
Есть класс &quot;студент&quot; и &quot;группа&quot;. В группе есть массив студентов. Как из main использовать методы класса студент, через класс группа?...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru