在不同的对象函数内部调用对象函数

时间:2010-09-27 21:00:01

标签: c++ function object

出于某种原因,我似乎无法做到这一点 好吧,我有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 个答案:

答案 0 :(得分:1)

这是你的问题:

collisions collisions;
score score;

您不应声明与其类型同名的变量。使类型大写,一切都应该适合你。另外,不要忘记将这两个变量的定义移到它们正在使用的函数之上。

答案 1 :(得分:1)

您创建了一个全局变量score,您显然希望collisions::lasers更新。这通常是一个坏主意,但我不会在这里讨论。

问题是你在score的定义之后声明了collisions::lasers变量,所以它无法访问变量。重新排列代码或将extern score声明放在顶部附近。

答案 2 :(得分:0)

我觉得你需要一个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_;
};

答案 3 :(得分:0)

两个问题。

正如其他人所指出的,类名与变量相同。我不太确定你能做到这一点,或者它甚至会编译。我的编译器肯定不喜欢它。

我建议你为你的课程命名,就像课堂上每个单词的大写起始字母和大写字母一样。所有其他字母小写。例如碰撞&得分了。或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.scored(100); // wrong... doesn't know anything about score, not in scope yet.
score::scored(100); // wrong.  scored member isn't declared as static.