使用给定框架调用/引用另一个类C++变量或函数

Calling/referencing a variable or function from another class C++ using given framework

本文关键字:另一个 C++ 变量 函数 引用 框架 调用      更新时间:2023-10-16

在过去的一周里,我一直在努力理解c ++指针。我不知道它是我们得到的框架还是只是 c++ 本身,但这就是我正在努力解决的问题:

我有一个垃圾游戏,我想实现一个功能,当玩家与花朵物体碰撞时,它会把玩家击退。

我有一个花对象的花类。(称为敌人之花.cpp)

我有一个人类对象的玩家类。(称为DemoBObject.cpp)

我怎样才能从人类对象引用我在花对象中的布尔值。当两者之间存在冲突时,布尔值为真。

我只能在DemoBObject类中移动人类,但我只能在敌人之花中检测到碰撞,所以我需要将来自敌方花的碰撞布尔值调用到DemoBObject。

我尝试过简单地像在java中那样调用它(目前在DemoBObject类中)

bool collisionresult = EnemyFlower::collision      

我尝试在花对象中设置一个返回函数:

 bool EnemyFlower::returncollision(){
    return collision;
}

然后尝试从人类对象(DemoBObject)引用它:

bool collision = &EnemyFlower::returncollision;

所有这些都有各种不同的迭代和更改。

TL:DR - I don't know how to point to a variable in one class from another class.

敌人之花.cpp - http://pastebin.com/LBCJcKwSDemoBObject.cpp - http://pastebin.com/6v9J63Ux

不应指向另一个类中的成员变量。这要么破坏了封装(使变量的private过时,如果你想把它激进化,对代码的读者来说是谎言),要么意味着变量一开始就没有private,即一开始就没有封装。

很有可能你根本不需要指针。C++不是Java。在 Java 中,你处理指针比在 C++ 中要多得多。Java只称它们为"引用",除了在NullPointerException的类名中,它给出了真相。Java 引用也比指针功能稍弱且危险C++但本质上它们是相同的功能。

在C++中,引用和指针是不同的东西。当您刚接触C++并且来自 Java 时,了解这一点非常重要。

让我们看一下这段代码:

bool collision = &EnemyFlower::returncollision;

这似乎是设置成员函数指针的尝试。我不会在这里使用函数指针,它们可能会使问题复杂化。

更好的设计是将整个碰撞检测部分移到类之外。碰撞既不是玩家的财产,也不是花朵的财产。也许拥有坐标或位置是两者的属性。这将产生如下函数:

bool FindCollision(DemoBObject const &player, Flower const &flower)
{
    // calculate collision using player.GetX(), player.GetY(), flower.GetCoords()
    // or something like that
    //
    // ...
    return collision;
}

这个FindCollision函数有两个有趣的方面。首先,它不需要指针而是引用(在 Java 中是不可能的)。其次,它不需要在一个班级里。在C++中,您经常使此类函数独立存在。同样,这在 Java 中是不可能的,在 Java 中,您经常必须人为地发明一个类并为其提供单个静态方法。

如果你坚持认为碰撞是花朵内部的一种状态(正如我所说,IMO不是一个好主意),那么执行以下操作:使碰撞标志成为Flower的私有布尔成员变量,并为该类提供一个返回该变量副本的公共成员函数:

花:

class Flower
{
private:
    bool m_collision;
    // ...
public:
    bool GetCollision() const;
    // ...
};

花.cpp:

bool Flower::GetCollision() const
{
    return m_collision;
}

请注意,我使用了 Java 中不可用的另一个功能:我使成员函数const 。在C++中,当成员函数不更改对象时,您可以将其设为const(有点简化,但这是一个很好的规则)。另请注意,这仍然根本不需要指针。

然后,可以从播放器类调用此成员函数。当然,这意味着播放器类需要引用类型为 Flower 的对象(再次,不是指针!

现在如果你的成员变量是static,那么恐怕整个类设计必须从头开始重做。在Java中也不会这样工作,因为这意味着所有花朵都只有一个碰撞状态。这当然没有意义。

相关文章: