【问题标题】:c++ override += with const referencec++ 使用 const 引用覆盖 +=
【发布时间】:2016-12-05 12:52:45
【问题描述】:

对于一个项目,我正在尝试使用矢量函数创建一个矢量类。我正在尝试通过覆盖 += 加法分配来添加向量加法函数。因为我不希望 += 函数更改要添加的值,所以我想将该值作为 const reference 传递。

我的代码:

Vector2D.h

#pragma once
class Vector2D
{
private:
    int m_x, m_y;
public:

    Vector2D(int x, int y);
    int getX();
    int getY();
    void setX(int x);
    void setY(int y);
    Vector2D& operator+=(const Vector2D&);
};

Vector2D.cpp

#include "Vector2D.h"
Vector2D::Vector2D(int x, int y)
{
    m_x = x;
    m_y = y;
}

int Vector2D::getX()
{
    return m_x;
}

int Vector2D::getY()
{
    return m_y;
}

void Vector2D::setX(int x)
{
    m_x = x;
}

void Vector2D::setY(int y)
{
    m_y = y;
}

Vector2D& Vector2D::operator+=(const Vector2D& toAdd)
{
    m_x += toAdd.getX();
    m_y += toAdd.getY();
    return *this;
}

但我得到了错误:

对象具有与成员不兼容的类型限定符 函数“Vector2D::getX”

int Vector2D::getX(void)': 无法将 'this' 指针从 'const 转换 Vector2D' 到 'Vector2D &'

我尝试将返回 x 和 y 的函数链接到 const

const int Vector2D::getX()
const int Vector2D::getY()

但这并不能解决错误。从参数中删除const 可解决所有错误并导致代码正常工作。

我应该如何更改我的代码以确保传递给 += 运算符的值不能被更改(例如通过在传递的对象上调用 setY(100))?

【问题讨论】:

    标签: c++ constants


    【解决方案1】:

    也制作Vector2D::getX() const。否则,您无法在 const 引用的对象上调用它。

    您添加const 的尝试应用于函数返回值,而不是this 指针

    const int Vector2D::getX()
    

    是非const 对象上的函数,返回const int

    int Vector2D::getX() const 
    

    const 对象上的函数。

    这就是为什么经常说“领先的const 具有误导性”的原因之一。

    【讨论】:

    • 我试过看到“我尝试将返回 x 和 y 的函数更改为 const:”
    • @SvenB,你没有改变函数,你改变了它们的返回值。 const 关键字的位置很重要。
    • 我想我没有对这个问题给出完整的解释。我的目标是传递一个无法更改的对象(例如调用 setX(200)。或者我误解了你的答案。
    • @SvenB,您只能在const 对象上调用标记为const 的成员函数。你没有正确标记函数,这就是我想告诉你的。
    • @SvenB,这是我的观点:A completely fixed example from your code.
    【解决方案2】:

    getX()getY() 是非常量成员函数,不能用 const 对象调用。因为他们不会修改类Vector2D的任何成员,你应该将他们标记为const member function,像

    int Vector2D::getX() const 
    

    注意const 的位置,应该放在函数声明的末尾,表示函数不会修改类的任何成员(可变成员除外)。 const int Vector2D::getX() 表示函数会返回一个常量,与成员函数的特性无关。实际上,返回一个常量内置类型并没有多大意义,从调用方的角度来看,它没有任何区别。

    【讨论】:

    • 我试过看到“我尝试将返回 x 和 y 的函数更改为 const”
    【解决方案3】:

    您正在寻找的是:常量成员函数

    int Vector2D::getX() const 
    

    函数声明中的参数列表后面的const表示该函数不修改对象的状态。

    可以为 const 和非 const 对象调用 const 成员函数,而 只能为非 const 对象调用非 const 成员函数

    在你的情况下,toAdd 是常量。

    【讨论】:

      猜你喜欢
      • 2020-11-21
      • 1970-01-01
      • 2018-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-03
      • 2021-03-14
      相关资源
      最近更新 更多