вызов функции объекта внутри другой функции объекта - PullRequest
2 голосов
/ 28 сентября 2010

По какой-то причине я не могу понять это правильно Хорошо, у меня есть 2 объекта

class score
{
  public:
  int scored(int amount);

  private:
  int currentscore;
}

int score::scored(int amount)
{
  currentscore += amount;
  return 0;
}

class collisions
{
  public:
  int lasers();
}

// ok heres my issue

int collisions::lasers()
{
  // some code here for detection
  // I need to somehow call score.scored(100);

  score.scored(100); // not working
  score::scored(100); // not working

  // how do i do that?
}

collisions collisions;
score score;

int main()
{
  while (true)
  {
    // main loop code here..
  }
  return 0;
}

Ответы [ 4 ]

1 голос
/ 28 сентября 2010

Вы создали глобальную переменную score, которую, очевидно, хотите обновить collisions::lasers.Обычно это плохая идея, но я не буду вдаваться в подробности.

Проблема в том, что вы объявили переменную score после определения collisions::lasers, поэтому она не может получить доступ кпеременная.Либо переставьте код, либо поместите объявление extern на score вверху.

1 голос
/ 28 сентября 2010

Это ваша проблема:

collisions collisions;
score score;

Не следует объявлять переменную с тем же именем, что и ее тип.Введите прописные буквы, и все должно работать нормально.Также не забудьте переместить определение этих двух переменных над функциями, в которых они используются.

0 голосов
/ 28 сентября 2010

Две проблемы.

Как уже отмечали другие, имя класса совпадает с переменной.Я не уверен, что вы можете сделать это, или он даже скомпилируется.Моему компилятору это, конечно, не нравится.

Я предлагаю вам назвать ваши классы как начальные буквы в верхнем и верхнем регистре для каждого слова в классе.Все остальные буквы строчные.например, столкновения и оценка.или CompactDisk и т. д.

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

Что вам нужно сделать, это изменить конструктор коллизий, чтобы принятьссылочная переменная оценки:

class collisions
{
  public:
    collisions(score &score);
    int lasers();

  protected:
    score& score_;
}

collisions(score& score)
 : score_(score) { }

Теперь лазеры должны ссылаться на переменную члена оценки

  score_.scored(100);

И вам необходимо изменить глобальные переменные следующим образом:

score the_score;
collisions the_collisions(the_score);

Это, конечно, при условии, что вам нужна только ОДНА копия копии партитуры.Если вам нужна одна копия Score для каждого класса коллизий, у вас не будет глобальной переменной Score, но вы просто удалите '&' из переменной-члена Score_ и удалите функцию конструктора, которая принимает ссылку.

И кстати.

score.scored(100); // wrong... doesn't know anything about score, not in scope yet.
score::scored(100); // wrong.  scored member isn't declared as static.  
0 голосов
/ 28 сентября 2010

Мне кажется, что вам нужна переменная-член score, скажем score_, внутри collisions класса, чтобы вы могли

int collisions::lasers()
{
    // some code here for detection

    // i need to somehow call score.scored(100);

    // score.scored(100); // not working
    // score::scored(100); // not working
    // how do i do that?

    score_.scored( 100 );
}

РЕДАКТИРОВАТЬ 1 Уточнениеscore_

class collisions {
  private:
    score score_;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...