C++ Использование методов класса  
Автор Сообщение

0
Сообщение C++ Использование методов класса

  Есть класс Level, в нём есть вектор экземпляров класса Mob. В классе Mob используется ссылка на экземпляр класса Player.  В классе Player используется ссылка на Level и т.д.

  Подскажите как правильно организовать эти гадские инклуды, или как можно неограничено использовать например методы класса Level в других классах (у меня в классе Level высчитывается столкновение, проверять столкновение нужно как мобам\снарядам\ так и игроку).

 

Меня эта магия уже утомила.  Unknow



20 ноя 2013, 01:30
Профиль

0
Сообщение C++ Использование методов класса

я б тоже послушал толковое обьяснение 



20 ноя 2013, 01:39
Профиль



<Фомальгаут>


Сервер: Свежеватель Душ
Рейтинг поля боя: 192
2х2: 1376
0
Сообщение C++ Использование методов класса

напиши с примером кода



20 ноя 2013, 06:47
Профиль

0
Сообщение C++ Использование методов класса

// Level.h

class Level {

#include "Mob.h"?

public:

  Level();
  ~Level();
  Tile* getTile(int x, int y);
  void AddMob(float x, float y);
  bool CollisionMob(float x, float y);
  void Update();
  void Render(sf::RenderWindow &window, sf::View &view);

private:

  std::vector<Tile*>tiles;
  std::vector<Mob*> mobs;

};

 

// Projectile.h

#include "Level.h"?

class Projectile {

public:
  ProjectileTest(float x, float y, float targetX, float targetY);
  ~ProjectileTest();

  bool isAlive();
  bool collision(float x, float y, Level &level);
  void move(Level &level);
  void remove();
  void render(sf::RenderWindow &window);
  float getX();
  float getY();

private:
  bool alive;
  float angle;
  float speed;
  float range;
  float offset;
  sf::Image image;
  sf::Texture texture;
  sf::Sprite sprite;
  sf::Vector2f point;
};

 

// Player.h

#include "Level.h"?

class Player : public Mob {
public:
  Player();
  Player(float x, float y);
  ~Player();
  void UpdateInput(sf::Event &Event);
  void Attack(float targetX, float targetY);
  void Render(sf::RenderWindow &window);
  void Update(Level &level);
  bool Collision(int x, int y, Level &level);
  void Move(Level &level);
  float GetX();
  float GetY();

private:
  sf::Clock timer;
  bool left, right, up, down;
  int frame;
  int anim;
  std::vector<Projectile*> projectiles;
  std::vector<SpecialEffect*> effects;
};

 

// Mob.h

#include "Player.h"?

class Mob {
public:
  sf::Vector2f point;
  sf::Texture texture;
  sf::Sprite sprite;
  sf::Image image;
  float speed;
  bool moving;
  bool attacking;

  // Generic
  virtual void Render(sf::RenderWindow &window) = 0;
  virtual void Update() = 0;
  virtual float GetX() = 0;
  virtual float GetY() = 0;

  // Used By Mob

  virtual void OrderMove(float x, float y) = 0;
  virtual void OrderStop() = 0;

  virtual void OrderAttack(Player &player);
  virtual void Move() = 0;

  // Used By Player
  virtual void UpdateInput(sf::Event &Event) = 0;
  virtual void Attack(float targetX, float targetY) = 0;
  virtual bool Collision(int x, int y, Level &level) = 0;
};



20 ноя 2013, 09:54
Профиль

0
Сообщение C++ Использование методов класса

если мне не изменяет память, давно на сях не писал, то тут может помочь

 

#ifndef __MY_CONST__

#define __MY_CONST__ 1

 

#include ....

 

Описание класса

 

#endif

 

Даже если инклюдить циклически, каждый хидер будет заинклюжен ровно 1 раз. Вроде как-то так.

 



20 ноя 2013, 11:09
Профиль

0
Сообщение C++ Использование методов класса

Насколько помню, в хедеры, с использованием ifndef инклюдишь все остальные необходимые хедеры, либо делать заглушки
http://stackoverflow.com/questions/1429336/cross-referencing-included-headers-in-c-program



20 ноя 2013, 11:10
Профиль

0
Сообщение C++ Использование методов класса

Ну что можно сказать, учите мат. часть, а именно правило объявления и подключения вложений.

  1. Нужно проверить наличие инклюд гварда в хэдерах:
    #ifndef INCLUDE_NAME_H
    #define INCLUDE_NAME_H
    ....

    #endif

  2. Объявить декларацию класса используемого в Level перед его использованием и убрать оттуда #include "Mob.h"


    #ifndef LEVEL_H
    #define LEVEL_H

    // Level.h
    Class Mob;

    class Level {
    public:

      Level();
      ~Level();
      Tile* getTile(int x, int y);
      void AddMob(float x, float y);
      bool CollisionMob(float x, float y);
      void Update();
      void Render(sf::RenderWindow &window, sf::View &view);

    private:

      std::vector<Tile*>tiles;
      std::vector<Mob*> mobs;

    };
    #endif



20 ноя 2013, 11:22
Профиль WWW

0
Сообщение C++ Использование методов класса

Инклуд гварды есть во всех хедерах классов, просто в примере не вписал их. Когда все включается по кругу, они не помогают.

DDUH писал(а):

Объявить декларацию класса используемого в Level перед его использованием и убрать оттуда #include "Mob.h"

 

Форвард декларация почему-то не рабоатет. Пробовал писать что-то типа class Mob; Но компилятор выдавал ошибку что-то типа "ссылка на неполный класс" или на int точно не помню. Или может нужно было написать полный интерфейс используемого класса ?



20 ноя 2013, 12:37
Профиль

0
Сообщение C++ Использование методов класса
хотел написать гневный ответ автору топика но ... я сдержался. з.ы. приложил бы хоть блок схему взаимодейсвия классов, а то по описанию похоже что ООП сломало поциенту мозг. в общем готов пообщатся в скайпе после 20:00 по москве Скайп syslol88


20 ноя 2013, 16:17
Профиль Skype

3
Сообщение C++ Использование методов класса

Microsoft Visual Studio 2012 - всё работает.

 

Mob.h

Код:
#pragma once

#include "Level.h"

class Mob
{
public:
    Mob(void);
    ~Mob(void);

    void test(Level* lvl);
};

 

Level.h

Код:
#pragma once
class Mob;
class Level
{
public:
    Level(void);
    ~Level(void);

    void test(Mob* mob);
};



20 ноя 2013, 16:48
Профиль WWW

0
Сообщение C++ Использование методов класса

Всем спасибо за помощь. Разобрался.

 

ЗЫ. Просто после явы на с++ перешел. Там с этим делом немного проще.



20 ноя 2013, 18:11
Профиль
Начать новую тему Ответить на тему


Перейти:  

На сайте использованы материалы, принадлежащие Blizzard Entertainment. Копирование материалов возможно только c разрешения портала. В противном случае это будет называться уже другим словом.
Рейтинг@Mail.ru