Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как сделать взаимодействие между классами 
V
    Опции темы
VolgaevLG
Дата 6.6.2011, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 21.12.2010

Репутация: 1
Всего: 1



Товарисчи! помогите
у меня в будущей игре (подобие змейки) есть два класса 

class GameField
{
   int x;             // координата х игрового поля
   int y;             // координата y игрового поля
   int width;      // ширина и 
   int height;     // высота, кароче параметры
};

и 

class GameSnake
{
   void DrawSnake()
      {
            // А здесь мне необходимо обратиться к вышеуказанным переменным первого класса
      }
};

Подскажите как это лучше сделать с профессиональной точки зрения smile 
PM MAIL   Вверх
awesome
Дата 6.6.2011, 23:40 (ссылка)  | (голосов:5) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 20.10.2010

Репутация: нет
Всего: нет



Код

class GameField
{
public:
   int x;             // координата х игрового поля
   int y;             // координата y игрового поля
   int width;      // ширина и 
   int height;     // высота, кароче параметры
};

и 

class GameSnake : public GameField
{
   void DrawSnake()
      {
            // А здесь мне необходимо обратиться к вышеуказанным переменным первого класса
      }
};

PM MAIL   Вверх
JЕT
Дата 6.6.2011, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 30.9.2010

Репутация: нет
Всего: нет



Сделать композицию.

Это сообщение отредактировал(а) JЕT - 6.6.2011, 23:53
PM MAIL   Вверх
Dem_max
Дата 7.6.2011, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



во тут предложены множество вариантов
http://forum.sources.ru/index.php?showtopic=331588


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
borisbn
Дата 7.6.2011, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(VolgaevLG @  6.6.2011,  20:59 Найти цитируемый пост)
А здесь мне необходимо обратиться к вышеуказанным переменным первого класса

к переменным класса обращаться нельзя. Можно только к переменным объекта класса. Соответственно где-то должен быть создан объект типа GameField (кстати, лучше сделать его не классом, а структурой. просто заменить class GameField на struct GameField).


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mes
Дата 7.6.2011, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(borisbn @  7.6.2011,  08:20 Найти цитируемый пост)
к переменным класса обращаться нельзя. Можно только к переменным объекта класса

к переменным полям класса обращаться можно..  smile 
полям класса в ООП соответсвуют статические дата члены в С++ smile

и чего это я сегодня такой придирчивай  smile 



--------------------
PM MAIL WWW   Вверх
borisbn
Дата 7.6.2011, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



mes,  smile 
но у ТС не было слова static в описании...
 smile 


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
baldina
Дата 7.6.2011, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Змейка ползает по полю (змейка знает о поле, поле о змейке -  нет). Из вопроса, как классу змейки обратиться к классу поля это тоже вытекает. Что бы змейка знала о поле, ей надо об этом сообщить. Например  конструкторе. Дальше змейка будет хранить ссылку на поле для своих операций.

Код

class GameField;

class GameSnake {
  GameField & field;

public:
  GameSnake (GameField & f) : field (f) {...}
  void DrawSnake ()
  {
     int w = field.get_width ();
     ...
  }
      
};


PM MAIL   Вверх
mes
Дата 7.6.2011, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(baldina @  7.6.2011,  13:28 Найти цитируемый пост)
Змейка ползает по полю (змейка знает о поле, поле о змейке -  нет).

мм.. а знает ли она о поле ?   smile   
а может она и о правилах в курсе ? smile 

Это сообщение отредактировал(а) mes - 7.6.2011, 14:37


--------------------
PM MAIL WWW   Вверх
Nostr
Дата 7.6.2011, 17:16 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 7.6.2011

Репутация: нет
Всего: нет



Можно сделать класс дружественным, можно сделать методы, которые будут возвращать параметры объекта
Код

vector get_position(){
  vector *a = new vector(this->x,this->y);
  return a;
}


PM MAIL   Вверх
VolgaevLG
Дата 7.6.2011, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 21.12.2010

Репутация: 1
Всего: 1



друзья, я не верно задал вопрос, это в принципе мне понятно, но из следующих вариантов:

1. сделать класс GameSnake дружественным к классу GameField, через конструктор класса GameSnake передать адрес созданного объекта GameField и получить к ним доступ

Код

class GameField
{
    int x;
    int y;

};

class GameSnake
{
   friend class GameField;
   GameField *myField;
 
     GameSnake(GameField *Field)
         {
            myField = Field;
         }; 

     void DrawSnake()
         {
            MoveTo(myField->x, myField->y)    // по-моему эта строчка неверна, но не суть
         };
   ...
};


2. Обойтись без friend, сделав необходимые параметры в классе GameField публичными, а остальное, аналогично прошлому примеру

3.  "можно сделать методы, которые будут возвращать параметры объекта", как посоветовал  Nostr
Код

vector get_position(){
  vector *a = new vector(this->x,this->y);
  return a;
}


как будет грамотней с точки зрения профессионального программирования, как бы сделал программист, а не "быдлокодер"

И исчо вопросы:
  что такое композиция?
  почему GameField лучше сделать структурой, я просто реализовываю функцию прорисовки поля через класс GameField, если сделать структурой, то удобнее будет обращаться?  тогда куда запихнуть функцию прорисовки поля
PM MAIL   Вверх
borisbn
Дата 7.6.2011, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Nostr, твоя ф-ция даже компилироваться не будет. Я не до коеца знаю stl, поэтому объясни как в конструктор вектора можно запихать два элемента?

Добавлено через 14 минут и 33 секунды
VolgaevLG, класс с общепринятой точки зрения должен содержать методы, управляющие его поведением. Если же в классе только (извиняюсь за подробности) члены, то логично сделать из него структуру, где все поля будут паблик 


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mes
Дата 7.6.2011, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



псевдокодом, надеюсь не запутаю smile
Код

namespace MyGame
{

 struct Field {};

 struct Snake {};

 struct Playing {
   void SetSnakeDirection (Direction);
   void NextIteration ();
};

struct FightPanel
{
      void OnKeyPressed (Key key) {  
       
        Direction d;

         switch {
              case Keys::LeftArrow:    playing.SetSnakeDirection (Left);
              case Keys::RightArrow:  playing.SetSnakeDirection (Right);
         }               
      }

      void Paint () { 
           DrawBackGround ();
           DrawField ();
           DrawSnake ();
      }
      OnTimer () {
          _playing.NextIteration ();
      }

     Playing _playing;
     Timer    _timer;
};
    
}


Добавлено через 2 минуты и 4 секунды
Цитата(VolgaevLG @  7.6.2011,  16:38 Найти цитируемый пост)
тогда куда запихнуть функцию прорисовки поля 

просисовка должна принадлежать окну, на котором Вы рисуете , либо выделена (или только частью) в отдельный класс рисовальщика.. 
размазывать отрисовку по коду очень не желательно.. 



--------------------
PM MAIL WWW   Вверх
VolgaevLG
Дата 7.6.2011, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 21.12.2010

Репутация: 1
Всего: 1



Благодарю, это все что я хотел узнать
PM MAIL   Вверх
mes
Дата 7.6.2011, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



связывать объекты _сцены_ между собой (посредством ссылок) также нежелательно, так как их поведение взаимозависимо, и лучше вынести логику в отдельный класс, в нашем случае Playing..

Добавлено через 1 минуту и 42 секунды
Цитата(VolgaevLG @  7.6.2011,  16:38 Найти цитируемый пост)
почему GameField лучше сделать структурой, 

в псевдокоде использовано struct  для простоты.. пишите что Вам больше подойдет.. 



--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1321 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.