2016-12-05 7 views
0

Для проекта я пытаюсь создать векторный класс с векторной функцией. Я пытаюсь добавить функцию добавления векторов, переопределяя присваивание + =. Поскольку я не хочу, чтобы функция + = меняла значение для добавления, я хочу передать это значение как const reference.C++ override + = with 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 (аннулируются) ': не удается преобразовать 'это' указатель от «сопзЬ Vector2D» к «Vector2D &»

Я попытался цепочки функций, которые возвращают х и у в const:

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

но это не решит ошибку. Удалите const из параметра, который разрешает все ошибки и приводит к рабочему коду.

Как изменить код, чтобы убедиться, что значение, переданное оператору + =, нельзя изменить (например, вызвав setY (100) на переданный объект)?

ответ

6

Vector2D::getX()const также. В противном случае вы не можете называть его объектом, указанным вами по ссылке const.

Ваша попытка добавления const была применена к функции возвращают значение, а не this указатель

const int Vector2D::getX() 

Есть функция на нерабочий const объекта, возвращающего const int.

int Vector2D::getX() const 

Является функцией на объекте const.

Это одна из причин, почему часто говорят, что «ведущий const вводит в заблуждение».

+0

Я попробовал это, увидев «Я попытался перестроить функции, возвращающие x и y в const:» –

+0

@SvenB, вы не изменили функции, вы изменили их возвращаемое значение. Размещение ключевого слова 'const' имеет значение. – StoryTeller

+0

Я думаю, что я не дал полного объяснения проблемы. Моя цель - передать объект, который не может быть изменен (например, call setX (200)). Или я неправильно передал ваш ответ. –

4

getX() и getY() - это неконстантные функции-члены, которые нельзя вызвать с помощью объекта const. Так как они не будут изменять любые члены класса Vector2D, вы должны пометить их как const member function, как

int Vector2D::getX() const 

Обратите внимание на положение const, которые должны быть предоставлены в конце объявления функции, означает, что функция выиграл» t изменять любые члены (кроме изменчивых) класса. const int Vector2D::getX() означает, что функция вернет константу, она не имеет ничего общего с характеристикой функции-члена. Фактически, возврат постоянного типа встраивания не имеет большого смысла, с точки зрения стороны вызывающего абонента, это не имеет никакого значения.

+0

Я попробовал это, увидев "Я пробовал перебирать функции, возвращающие x и y в const" –

+0

@SvenB Ответ отредактирован. – songyuanyao

0

Что вы ищете: Функции постоянных членов.

int Vector2D::getX() const 

Конст после списка аргументов в объявлении функции указывает на то, что функция не изменяет состояние объекта.

Функция const member может быть вызвана как для const, так и для объектов non-const, тогда как функция non-const member может быть вызвана только для объектов, не являющихся константами.

В вашем случае toAdd is const.

Смежные вопросы