gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:58:20 28 4
gpt4 key购买 nike

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

目前我有一个垃圾游戏,我想实现一个功能,当玩家与花对象碰撞时将其击退。

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

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

我如何从人类对象中引用花对象中的 bool 值。当两者发生碰撞时, bool 值为真。

我只能在 DemoBObject 类中移动人,但我只能在 Enemy Flower 中检测到碰撞,因此我需要将碰撞 bool 从 enemy flower 调用到 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.

EnemyFlower.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;

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

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

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 的私有(private) bool 成员变量>,并为该类提供一个返回该变量的拷贝的公共(public)成员函数:

花.h:

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++ 类调用/引用变量或函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22879664/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com