【问题标题】:calling an objects function while inside a different objects function在不同的对象函数中调用对象函数
【发布时间】:2010-09-27 21:00:00
【问题描述】:

由于某种原因,我似乎无法做到这一点 好的,我有 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;
}

【问题讨论】:

  • 将对象实例命名为与类名相同的东西只能以泪水结尾。
  • 两年后回看这篇文章,我不敢相信我的编码技术有多糟糕。

标签: c++ function object


【解决方案1】:

这是你的问题:

collisions collisions;
score score;

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

【讨论】:

  • 实际上,您可以将对象命名为与其类型名称相同的名称。你不应该。
  • @James McNellis:嗯,对...我会稍微改一下我的答案:)
  • 我曾经认为你的“不应该”部分是“不能”。你能举个例子我是怎么“能”的吗?
【解决方案2】:

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

问题是你在collisions::lasers的定义之后声明了score变量,所以它不能访问这个变量。重新排列代码或在顶部附近放置 scoreextern 声明。

【讨论】:

    【解决方案3】:

    在我看来你需要一个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_;
    };
    

    【讨论】:

    • 但我有一个分数类,它应该管理分数,因为有很多方法可以从其他 obj/函数中得分/松动/重置点
    • @EddieV223:此答案不会删除您的分数等级。它只是将 score 的实例放入碰撞中,而不是将其作为全局变量。
    • 是否也可以将相同分数对象的实例放在其他类中?
    • 是的,可以将score 类型的变量放在你想要的任意多个类中,但是,无论你把它放在哪里,你都必须“维护”它. “维护”是指不断更新。
    • 我认为我在 #include 冲突.h 文件中的 Score 类时遇到了问题,错误说在 Collisions::thescore 中取消定义类“Score”我将我的类的名称更改为 Score以及 Collisions to thescore 中的变量,但似乎存在一个问题,它仍然不知道 Score 是什么。如果我添加#include“score.h”,那么它会错误地重新定义我的 Score 类......
    【解决方案4】:

    两个问题。

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

    我建议你为你的类命名,比如使用大写的开头字母和类中每个单词的大写字母。所有其他字母小写。例如碰撞和得分。或光盘等。

    第二个问题是,collisions 对您在全局范围内声明的变量 score 一无所知。

    您需要做的是更改碰撞构造函数以获取分数参考变量,如下所示:

    class collisions
    {
      public:
        collisions(score &score);
        int lasers();
    
      protected:
        score& score_;
    }
    
    collisions(score& 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.  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-02
      • 1970-01-01
      • 2015-10-22
      • 1970-01-01
      • 2015-03-27
      • 1970-01-01
      相关资源
      最近更新 更多