2016-12-05 1 views
0

프로젝트의 경우 벡터 함수를 사용하여 벡터 클래스를 만들려고합니다. + = 덧셈을 오버라이드하여 벡터 덧셈 함수를 추가하려고합니다. 왜냐하면 + = 함수가 더하기 값을 변경하여 그 값을 const reference으로 전달하기를 원하지 않기 때문입니다. C++ override + = const 참조

내 코드 :

:하지만 오류를

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"

Vector2D :: getX (무효)가

INT와 호환되지 않습니다 예선을 입력있다

'&을 Vector2D'에서 'CONST Vector2D'에서 I는 const로 X와 Y를 반환 기능 체인 시도 :

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

하지만이 방법으로는 오류가 해결되지 않습니다. 매개 변수에서 const을 제거하면 모든 오류와 작업 코드의 결과가 해결됩니다.

+ = 연산자에 전달 된 값을 변경할 수 없도록 코드를 변경해야합니까 (예 : 전달 된 객체에서 setY (100) 호출)?

답변

6

Vector2D::getX()const도 마찬가지입니다. 그렇지 않으면 const 참조로 가지고있는 객체에서 호출 할 수 없습니다. const를 추가로

귀하의 시도가 기능에 적용되었다

const int Vector2D::getX() 

const int 반환하는 비 const 객체에 함수가 아니라 this 포인터 값을 반환합니다.

int Vector2D::getX() const 

const 개체의 기능입니다.

이것이 "선도적 인 const은 오해의 소지가있다"고 종종 언급하는 이유 중 하나입니다.

+0

나는 "나는 const로 x와 y를 반환하는 함수를 chan하려고 시도했다." –

+0

@SvenB, 함수를 변경하지 않았으므로 반환 값을 변경했습니다. 'const' 키워드의 배치는 중요합니다. – StoryTeller

+0

나는이 문제에 대한 완전한 묘사를하지 않았다고 생각한다. 내 목표는 변경 될 수없는 개체를 전달하는 것입니다 (예를 들어 setX (200) 호출). 또는 대답을 잘못 해석했습니다. –

4

getX()getY()은 const 개체가 아닌 호출 할 수없는 비 const 멤버 함수입니다. 그들이 클래스 Vector2D의 구성원을 수정하지 않습니다 때문에, 당신은

int Vector2D::getX() const 

주 함수 선언의 마지막에 넣어해야 const의 위치, 같은 const member function로 표시해야 '함수가 수상 의미 그 클래스의 어떤 멤버 (변경 가능한 것을 제외하고)를 수정하지 마라. const int Vector2D::getX()은 함수가 상수를 반환한다는 것을 의미하며 멤버 함수의 특성과는 아무런 관련이 없습니다. 사실, 일정한 빌드 인 타입을 반환하는 것은별로 중요하지 않습니다. 호출자 측의 관점에서 보면 아무런 차이가 없습니다.

+0

"나는 const에 x와 y를 반환하는 함수를 chan하려고했습니다." –

+0

@SvenB 답변이 수정되었습니다. – songyuanyao

0

당신이 찾고있는 무엇을 : 상수 구성원 기능.

int Vector2D::getX() const 

함수 선언에 인수 목록 후 const를 는 함수가 객체의 상태를 수정하지 않음을 나타냅니다.

const 멤버 함수는 const 및 non-const 개체 모두에 대해 호출 할 수 있지만 비 const 멤버 함수는 const가 아닌 개체에 대해서만 호출 할 수 있습니다.

귀하의 경우 toAdd은 const입니다.