使用给定框架调用/引用另一个类C++变量或函数
Calling/referencing a variable or function from another class C++ using given framework
在过去的一周里,我一直在努力理解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中也不会这样工作,因为这意味着所有花朵都只有一个碰撞状态。这当然没有意义。
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 运行同一解决方案的另一个项目的项目
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- C++从另一个类访问公共静态向量的正确方法是什么
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- 使用std::transform将一个范围的元素添加到另一个范围中
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 修改函数中的指针(将另一个指针作为参数传递)
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- C++试图读取一个文件并输出到另一个文本文件
- 如何将指针从一个void函数传递到另一个C++
- 如何从另一个文件继承私有成员变量和公共函数
- 使用.find函数在c++中查找字符和另一个字符之间的大小
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- C++-我可以创建另一个类的成员并在构造函数中使用它吗
- 如何在C++中将函数发送到另一个进程
- 如何通过按下第三个窗口中的按钮,将QString从一个窗口获取到另一个窗口