调用函数时,类对象的成员变量不会改变

时间:2018-07-19 19:10:01

标签: c++ class member-variables

我的问题是我无法更改类成员的变量值,我已经尝试了所有想到的方法

因此,这里涉及以下代码:

const assert = require('assert');
const mongoose = require('mongoose');
mongoose.set('debug', true);

const GITHUB_ISSUE = `init`;
const connectionString = `mongodb://localhost:27017/${ GITHUB_ISSUE }`;
const { Schema } = mongoose;

run().then(() => console.log('done')).catch(error => console.error(error.stack));

async function run() {
  await mongoose.connect(connectionString);
  await mongoose.connection.dropDatabase();

  const schema = new mongoose.Schema({
    name: String
  });
  schema.post('init', () => { throw new Error('Oops!'); });

  const M = mongoose.model('Test', schema);

  await M.create({ name: 'foo' });

  await M.findOne(); // Throws "Oops!"
}

所以问题是我的播放器类中有一个Collision的类成员,并且正在从我的播放器访问Collision对象,并检查它是否与另一个对象发生碰撞,如果是,它将返回true,并且还应该设置内部标记的碰撞方向,但是从“ isColliding()”函数返回后,尚未设置碰撞对象的标记

我不太了解这里可能是什么问题,我尝试调试它并尝试逐步进行。我的观察是,实际上它确实在函数调用期间设置了标志,但是一旦返回,信息就会丢失

任何帮助将不胜感激!

编辑:这是getCollisionObject()函数:

if(player.getCollisionObject().isColliding(platform1))
{
    if(player.getCollisionObject().up)
        std::cout << "Colliding from top\n";
    if(player.getCollisionObject().down)
        std::cout << "Colliding from bottom\n";
    if(player.getCollisionObject().left)
        std::cout << "Colliding from left\n";
    if(player.getCollisionObject().right)
        std::cout << "Colliding from right\n";
}

bool Collision::isColliding(const Entity &other)
{
    resetCollisionDirection();

    sf::Vector2f otherCenterPosition = other.getCenterPosition();
    sf::Vector2f otherSize = other.getSize();

    float deltaX = m_CenterPosition.x - otherCenterPosition.x; // abs(deltaX) - (thisX + otherX)
    float deltaY = m_CenterPosition.y - otherCenterPosition.y;

    float resultX = abs(deltaX) - (m_Size.x / 2 + otherSize.x / 2); 
    float resultY = abs(deltaY) - (m_Size.y / 2 + otherSize.y / 2);

    if(resultX < 0 && resultY < 0) 
    {
        if(m_CenterPosition.x < otherCenterPosition.x)
            left = true;
        if(m_CenterPosition.x > otherCenterPosition.x)
            right = true;
        if(m_CenterPosition.y < otherCenterPosition.y)
            up = true;
        if(m_CenterPosition.y > otherCenterPosition.y)
            down = true;

        return true;
    }
    return false;
}

class Collision
{
public:
    Collision(const Entity &entity);

    void reset(const Entity &entity);
    bool isColliding(const Entity &other);

    bool up, down, left, right;

private:
    void resetCollisionDirection();

private:
    sf::Vector2f m_CenterPosition, m_Size;

};

编辑:发现上面函数返回一个副本的问题(抱歉,我是个白痴)将其更改为

Collision Player::getCollisionObject()
{
    return m_CollisionBody;
}

1 个答案:

答案 0 :(得分:1)

有问题。 getCollisionObject()按值返回。更改为

Collision &Player::getCollisionObject()