使用成员函数在类中设置POINT2f/VECTOR2f变量的x或y

Setting x or y of a POINT2f/VECTOR2f variable in a class using a member function

本文关键字:变量 VECTOR2f POINT2f 设置 成员 函数      更新时间:2023-10-16

我有以下类:

//----------------------------------------------------------------------
//                              CHARACTER CLASS
//----------------------------------------------------------------------
class Character
{
private:
    POINT2f char_position;
public:
    VECTOR2f char_velocity;
    Character();
    ~Character();
    // Mutators
    void SetChar_Position(POINT2f p);
    void SetChar_Velocity(VECTOR2f v);
    // Accessors
    POINT2f GetChar_Position();
    VECTOR2f GetChar_Velocity();
};
//----------------------------------------------------------------------
//          PLAYER CLASS - INHERITED FROM "CHARACTER" CLASS
//----------------------------------------------------------------------
class Player : public Character
{
private:
public:
int health;
Player();
~Player();
void SetPlayer_Health(int h);
int GetPlayer_Health();
};
所以从本质上来说,玩家类继承自角色类。

Character类有一个成员函数,可以让你设置字符的位置和速度,它接受POINT2f和VECTOR2f。

在我的主要代码中,我创建了一个玩家角色Player Player1,然后在按下按钮时设置球的速度和位置:

if (ui.isActive('A'))   // Check to see if "A" key is pressed
    {
        // Player Ball
        Player1.SetChar_Velocity.x = -12.0;
        Player1.SetChar_Position.x += (Player1.GetChar_Velocity.x*dt);
        Player1.SetChar_Velocity.x += (acceleration*dt);
    }

我目前得到的错误说left of .x must have class/struct/union,所以我把Player1.SetChar_Velocity.x = -12.0;改为Player1.SetChar_Velocity().x = -12.0;,这比错误expression must have class typeto few arguments in function call

有没有人知道一个方法,将允许我只操作char_velocity的x号。我也明白,我的代码Set .x速度是不正确的,因为我没有传递一个VECTOR2f的值。

为了实现您想要做的事情,您将希望您的Get_方法的返回类型是引用(wiki)。您的代码将看起来像

class Character
{
private:
    POINT2f char_position;
public:
    VECTOR2f char_velocity;
    // Accessors
    POINT2f& GetChar_Position() { return char_position; }
    VECTOR2f& GetChar_Velocity() { return char_velocity; }
};
此外,通常建议或要求能够在代码中保持const正确性,因此您可能希望添加
const POINT2f& GetChar_Position() const { return char_position; }
const VECTOR2f& GetChar_Velocity() const { return char_velocity; }

这将允许你做一些调用,如

POINT2f current_pos = a_char.GetChar_Position(); // const 
a_char.GetChar_Velocity().x += 2;                // non-const

请注意,通常建议将结构体作为const引用而不是副本传递(尽管根据您的c++版本和类型,这可能不成立,您可以查看此问题以进行澄清),因此更改

void SetChar_Position(POINT2f pos) { char_position = pos; }
void SetChar_Velocity(VECTOR2f vel) { char_velocity = vel; }

void SetChar_Position(const POINT2f& pos) { char_position = pos; }
void SetChar_Velocity(const VECTOR2f& vel) { char_velocity = vel; }