Форум программистов, компьютерный форум CyberForum.ru

Ссылки в классе. Отследить изменения переменной - C++

Восстановить пароль Регистрация
 
rostov888
0 / 0 / 0
Регистрация: 20.04.2014
Сообщений: 8
21.04.2014, 10:22     Ссылки в классе. Отследить изменения переменной #1
Пишу игру в проекте есть 4 класса class Entity, class PLAYER, class Animation и class AnimationManager.
Переменная cuurentFrame - это номер текущего кадра анимации .
Значение cuurentFrame изменяется в функции void tick() которая находиться в классе Animation.

Идея заключается в том , что бы отслеживать изменения этой переменной в функции void update которая находиться в классе PLAYER .

Для этого нужно создать ссылку на currentFrame и инициализировать эту ссылку в конструкторе класса PLAYER , после чего выводить на экран значения переменной с помощью ссылки в функции void upadte класса PLAYER.
class PLAYER: public Entity
{
public:
.....
float &CURRENTFrame;


PLAYER(AnimationManager &a,Animation &b, int x,int y):Entity(a,x,y)
{
...
&CURRENTFrame=b.currentFrame;
}
Но компилятор говорит о неправильности этой строчки
&CURRENTFrame=b.currentFrame;
Текст ошибки :
Код
1>main.cpp(75): error C2758: 'PLAYER::CURRENTFrame' : must be initialized in constructor base/member initializer list
1>\main.cpp(71) : see declaration of 'PLAYER::CURRENTFrame'
Как решить эту проблему ??????

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
class Animation
{
public:
std::vector<IntRect> frames, frames_flip;
 
float currentFrame, speed;  // вот то самый currentFrame
bool loop, flip, isPlaying; 
Sprite sprite;
 
 
Animation()
{
currentFrame = 0;
isPlaying=true;
flip=false;
}
// функция где проигрывается анимация 
void tick(float time,float &setRo, float &SpeedRot, bool fra,bool &currentBool)
{
 currentFrame += speed * time; // здесь изменяется значение cuurentFrame
                int i = currentFrame;
  sprite.setTextureRect( frames[i] );
  if (flip) sprite.setTextureRect( frames_flip[i] );
}
 
};
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
class Entity
{
public:
    float x,y,dx,dy,w,h;
    float w2,h2;
    AnimationManager anim;
 
 std::vector<Object> obj;
 bool life, dir;
 float timer, timer_end;
 String Name;
 int Health;
 
 Entity(AnimationManager &A,int X, int Y)
 { 
  anim = A;
  x = X;
  y = Y;
  dir = 0;
 
  life=true;
  timer=0;
  timer_end=0;
  dx=dy=0;
 }
 
 virtual void update(float time) = 0;
 
 void draw(RenderWindow &window)
 {.....}
 
 FloatRect getRect()
 {.... }
 
 void option(String NAME, float SPEED=0, int HEALTH=10, String FIRST_ANIM="")
 {... }
 
};
Вот класс PLAYER

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
class PLAYER: public Entity
{
public:
 enum {stay,goRight,goUp,upRight} STATE;
 bool onLadder, shoot, hit,fra,currentBool,animbool;
 std::map<std::string,bool> key;
 Animation anonTest;
 float setRot,SpeedRot;
 float &CURRENTFrame; // Ссылка на переменную currentFrame класса Animation
 
 
 PLAYER(AnimationManager &a,Animation &b, int x,int y):Entity(a,x,y)
 { 
 option("Player",450,450,"goRight");
        STATE=stay; hit=0;
 setRot=SpeedRot=0;
 fra=false;
 currentBool=false;
 animbool=true;
   
                                    &CURRENTFrame=b.currentFrame;
 }
 
 void KeyCheck()
 {
         // Функция которая принимает нажатие клавиш 
 }
 
 void update(float time)
 { 
  KeyCheck();
 
  if (STATE==stay)    anim.set("stay");
  if (STATE==goUp)    anim.set("goUp");
  if (STATE==goRight) anim.set("goRight");
 
    
  std::cout <<" CURRENTFrame "<< CURRENTFrame<<"\n";
 
  
                anim.tick(time,setRot,SpeedRot,fra,currentBool);
 
  key["R"]=key["L"]=key["Up"]=key["Down"]=key["Space"]=false;
 }
};
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
4324 / 3745 / 1260
Регистрация: 14.04.2014
Сообщений: 14,688
21.04.2014, 10:43     Ссылки в классе. Отследить изменения переменной #2
А зачем вообще тебе ссылка? Почему не просто float CURRENTFrame; ?
IrineK
Заблокирован
21.04.2014, 11:01     Ссылки в классе. Отследить изменения переменной #3
CURRENTFrame стоит под модификатором public, значит видно для всех, кто видит определение класса.
Пользуйте прямо и радуйтесь.
rostov888
0 / 0 / 0
Регистрация: 20.04.2014
Сообщений: 8
21.04.2014, 14:57  [ТС]     Ссылки в классе. Отследить изменения переменной #4
Нет , нет , мне нужно отслеживать изменения переменой currentFrame в функции update класса PLAYER
Цитата Сообщение от nmcf Посмотреть сообщение
Почему не просто float CURRENTFrame; ?
ссылка нужна для того что бы ссылться на currentFrame класса Animation .

Если не ссылкой то как тогда отслеживать изменения currentFrame в "чужом" классе PLAYER ?
newbie666
Заблокирован
21.04.2014, 15:00     Ссылки в классе. Отследить изменения переменной #5
под какую ОС пишешь?
rostov888
0 / 0 / 0
Регистрация: 20.04.2014
Сообщений: 8
21.04.2014, 15:04  [ТС]     Ссылки в классе. Отследить изменения переменной #6
windows 7 64bit

Добавлено через 38 секунд
Цитата Сообщение от newbie666 Посмотреть сообщение
под какую ОС пишешь?
Под windows 7 64 bit
newbie666
Заблокирован
21.04.2014, 15:06     Ссылки в классе. Отследить изменения переменной #7
Цитата Сообщение от rostov888 Посмотреть сообщение
Под windows 7 64 bit
Хреново, т.к. начиная с Windows8 есть функции для отслежки изменения памяти переменных, типа брейкоинта DataChange
rostov888
0 / 0 / 0
Регистрация: 20.04.2014
Сообщений: 8
21.04.2014, 15:16  [ТС]     Ссылки в классе. Отследить изменения переменной #8
Блин , подскажи пожалуйста как это исправить ?
newbie666
Заблокирован
21.04.2014, 15:21     Ссылки в классе. Отследить изменения переменной #9
Цитата Сообщение от rostov888 Посмотреть сообщение
&CURRENTFrame=b.currentFrame;
тут амперсант слева убери
rostov888
0 / 0 / 0
Регистрация: 20.04.2014
Сообщений: 8
21.04.2014, 17:26  [ТС]     Ссылки в классе. Отследить изменения переменной #10
ок, сейчас попробую

Добавлено через 3 минуты
Все равно не доволен :_

Пишет :
error C2758: 'PLAYER::CURRENTFrame' : must be initialized in constructor base/member initializer list
main.cpp(71) : see declaration of 'PLAYER::CURRENTFrame'
[cut]

Добавлено через 51 минуту

Добавлено через 2 минуты
http://5.firepic.org/5/images/2014-0...3jfygbtbw6.png

Добавлено через 1 час 4 минуты
Какие могут быть еще пути решения ?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
21.04.2014, 17:30     Ссылки в классе. Отследить изменения переменной #11
Цитата Сообщение от rostov888 Посмотреть сообщение
Какие могут быть еще пути решения ?
ВАМ УЖЕ В ПРОШЛОЙ ТЕМЕ ОТВЕТИЛИ!!!
Ссылка на переменную другого класса

Добавлено через 1 минуту
Цитата Сообщение от newbie666 Посмотреть сообщение
тут амперсант слева убери
ссылки инициализируются в списке инициализации.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.04.2014, 18:42     Ссылки в классе. Отследить изменения переменной
Еще ссылки по теме:

ссылки на тип данных в классе C++
В классе инициализировать массив, в классе создать функцию вывода массива на экран C++
Область видимости переменной в классе C++

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

Или воспользуйтесь поиском по форуму:
rostov888
0 / 0 / 0
Регистрация: 20.04.2014
Сообщений: 8
21.04.2014, 18:42  [ТС]     Ссылки в классе. Отследить изменения переменной #12
ОК ! Спасибо за ответ !

Но все же работает не все ))

Сделал так :
float &CURRENTFrame;


PLAYER(AnimationManager &a,Animation &b, int x,int y):Entity(a,x,y),CURRENTFrame(b.currentFrame)
{
option("Player",450,450,"goRight");
STATE=stay; hit=0;
setRot=SpeedRot=0;
fra=false;
currentBool=false;
animbool=true;


}
Все скомпилировалось , но CURRENTFrame как равнялся нулю так и равняется , а currentFrame свое значение меняет .

void update(float time)
{
std::cout <<" CURRENTFrame "<< CURRENTFrame<<"\n";
}
Yandex
Объявления
21.04.2014, 18:42     Ссылки в классе. Отследить изменения переменной
Ответ Создать тему
Опции темы

Текущее время: 04:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru