c++ - 我应该在这里使用 friend 类吗?

标签 c++ class friend

我刚刚和我的一个 friend 一起回到 C++。我正在编写一个基于文本的基本地牢游戏,试图让玩家向上、向下、向左和向右移动。那么我的问题有两个部分。

我创建了一个 Map 类、一个 Player 类和一个 GameLoop 类。发生的一切显然都在我的 GameLoop 中。 Map 类有一个名为 Move() 的函数来移动玩家。在 Map 类中,我应该让我的 Player 类对 Map 类有友元访问吗?我对何时使用 friend 类有点困惑。我想知道游戏循环函数是否应该使用 map.Move(),或者我是否应该将 Move() 放入 Player 类中,让他们成为 friend ,然后使用 player.Move()。

我的 map 类保存坐标的私有(private)数据,这是我的玩家所在的位置。

我知道这可能有点主观,但我说的是一般情况。使用友元类比直接使用 Map 对象更有效吗?

关于我的第二个问题。我知道类很常见,但我想知道对象是否如此。是否应该为每个类至少创建一个对象,或者您甚至可以创建一个类并在不创建对象的情况下使用它?

最佳答案

类很有用,因为它们可以有方法和状态/数据。一般来说,如果你的类中有任何数据,你不创建任何对象是没有意义的。然而, 您可以实现一个仅由公共(public)静态函数组成的实用程序类。在这种情况下,您不必创建任何对象。

Class CMyHelper
{
public:
    static double calculateDistance(CPoint A, CPoint B);
    static double calculateArea(double length, double width);
    //...
private:
    // You can even explictly say, I don't want make objects of this class.
    // You'll get a compile-time error if someone tries.
    CMyHelper();
    CMyHelper(const CMyHelper&);
}

CPoint A(100, 200);
CPoint B(50, 100);
//Call static method without instantiation
CMyHelper::calculateDistance(A, B);

在您的情况下,我们可以看到不需要使用静态类和友元类。

对我来说, friend 类是我最后求助的事情。根据您的描述,您可以将 move() 设为 player 类的公共(public)方法,因为真正“移动”的是玩家而不是 map。此外,您需要向我们说明您的 map 类是做什么的。

编辑:如果您的 map 类足够简单可以删除,您可以将玩家的坐标移动到玩家类。

Class CPlayer
{
public:
    void move()
    {
        // moves up, down, left, or right
        // update m_position
    }
}

private:
    CCoordinate m_position;
}

关于c++ - 我应该在这里使用 friend 类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5846384/

相关文章:

c++ - 通过作为另一个类的成员函数的友元函数设置值

c++ - 在 Qt 项目中包括谷歌测试

javascript - 将 HashString 从 C 转换为 JS

asp.net - vb.net View 状态与公共(public)变量

javascript - CoffeeScript 将对象映射到类实例

c# - 如何在C#和VB.NET中模拟C++ friend ?

c++ - 重载运算符 == C++

c++ - 在 CUDA 中实现可变长度(本地)数组的等价物

c++ - 我不断收到一条错误消息,说我的类(class)没有命名类型

PHP好友添加系统不能正常工作