Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Как сделать взаимодействие между классами


Автор: VolgaevLG 6.6.2011, 20:59
Товарисчи! помогите
у меня в будущей игре (подобие змейки) есть два класса 

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

и 

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

Подскажите как это лучше сделать с профессиональной точки зрения smile 

Автор: awesome 6.6.2011, 23:40
Код

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

и 

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

Автор: JЕT 6.6.2011, 23:52
Сделать композицию.

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

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

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

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

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

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

Автор: borisbn 7.6.2011, 13:46
mes,  smile 
но у ТС не было слова static в описании...
 smile 

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

Код

class GameField;

class GameSnake {
  GameField & field;

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


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

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

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

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


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

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, если сделать структурой, то удобнее будет обращаться?  тогда куда запихнуть функцию прорисовки поля

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

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

Автор: mes 7.6.2011, 18:36
псевдокодом, надеюсь не запутаю 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 Найти цитируемый пост)
тогда куда запихнуть функцию прорисовки поля 

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

Автор: VolgaevLG 7.6.2011, 18:40
Благодарю, это все что я хотел узнать

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

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

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

Автор: VolgaevLG 7.6.2011, 19:17
 smile я уж понял, я уже творю, snake и field сделал структурами, а работаю с ним через класс game, и как я сам до этого не додумался))

Автор: Nostr 8.6.2011, 05:54
Цитата(borisbn @ 7.6.2011,  17:43)
Nostr, твоя ф-ция даже компилироваться не будет. Я не до коеца знаю stl, поэтому объясни как в конструктор вектора можно запихать два элемента? 

Это псевдокод. Я имел ввиду какой-нибудь самописный вектор.

Код

struct vector{ 
  int x,y;
конструктор...
};


ну или типа того... Конечно же можно STL использовать. Кому как удобнее ))
Я вот 

Автор: Леопольд 8.6.2011, 15:08
Цитата(borisbn @  7.6.2011,  17:43 Найти цитируемый пост)
Я не до коеца знаю stl, поэтому объясни как в конструктор вектора можно запихать два элемента?

Код
explicit vector ( size_type n, const T& value= T(), const Allocator& = Allocator() );
http://cplusplus.com/reference/stl/vector/vector/

Автор: borisbn 8.6.2011, 16:36
Леопольд, я, наверное, неправильно выразился. Нужно было сказать
как в конструктор вектора можно запихать два разных элемента ?
Думаю здесь
Цитата(Nostr @  7.6.2011,  17:16 Найти цитируемый пост)
 vector *a = new vector(this->x,this->y);

имелось в виду не что, this->x это кол-во, а this->y значение по-умолчанию...

Nostr уже сказал, что это псевдокод, поэтому дальнейшее - вода в ступе. IMHO. 

Автор: Леопольд 9.6.2011, 14:08
borisbn, я имел ввиду что скомпиляется без проблем, только делать будет не то...
Цитата(borisbn @  8.6.2011,  16:36 Найти цитируемый пост)
поэтому дальнейшее - вода в ступе. IMHO.  


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)