2016-12-05 10 views
0

私はベクトル関数を持つベクトルクラスを作成しようとしているプロジェクトです。 + =加算代入をオーバーライドしてベクトル加算関数を追加しようとしています。私は+ =関数で値を変更する必要はないので、その値をconst referenceとして渡したいと思います。C++のオーバーライド+ = 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と互換性のない修飾子型を持ちます'CONST Vector2D' から 'Vector2D &' に

Iは、constにxとyを返す関数を連鎖試み:

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

しかし、これはエラーを解決しません。パラメータからconstを削除すると、すべてのエラーが解決され、作業コードが生成されます。

+ =演算子に渡される値を変更できないようにコードを変更するにはどうすればよいですか(たとえば、渡されたオブジェクトでsetY(100)を呼び出すなど)。

答えて

6

Vector2D::getX()constも同様です。さもなければあなたはconst参照によって持っているオブジェクトでそれを呼び出すことができません。

constを追加することであなたの試みが関数に適用してはいないthisポインタ

const int Vector2D::getX() 

const intを返す非constオブジェクト上の関数であり、値を返します。

int Vector2D::getX() const 

constオブジェクトの関数です。

これは、「先頭のconstが誤解を招く」とよく言われる理由の1つです。

+0

私は "私はconstにxとyを返す関数を書き換えようとしました:" –

+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を返す関数をちょっと試してみました」 –

+0

@SvenB回答が編集されました。 – songyuanyao

0

あなたが探しているものは:定数メンバー関数です。

int Vector2D::getX() const 

関数宣言における引数リスト後のconst は、関数がオブジェクトの状態を変更しないことを示しています。

constメンバ関数はconstオブジェクトとnon-constオブジェクトの両方に対して呼び出すことができますが、非constメンバ関数はconst以外のオブジェクトに対してのみ呼び出すことができます。

あなたの場合、toAddはconstです。

関連する問題