#頻発ミス
VisualStudioで、こんなErrorが出たことはありませんか?
オブジェクトにメンバ関数と互換性のない型修飾子があります
ちょっと例を出してみましょう。
class Sample
{
private:
int member_;
public:
// constructorとかsetterとかは省略しています.
Sample(const Sample& argSample);
int getMember();
};
#include "Sample.h"
Sample::Sample(const Sample& argSample)
{
member_ = argSample.getMember();
}
int Sample::getMember()
{
return member_;
}
・・・さて、こんな感じのコードだと、イントロにあるようなErrorが出てきてしまいます。
原因は一体何でしょうか?
#Errorの原因
このメンバ関数では「const参照渡し」をしていますね。
Sample(const Sample& argSample);
Sample::Sample(const Sample& argSample)
{
member_ = argSample.getMember();
}
・・・ん?
このメンバ関数があかんことになっていますね。
int getMember();
int Sample::getMember()
{
return member_;
}
そう・・・「const修飾子」が無いのです!
constオブジェクトからは、constメンバ関数しか呼び出すことができません!
#const修飾子
const 修飾子を使う目的は「値を書き換えられなくする」ということです。
・変数:値が変更できなくなる
// 宣言の先頭につける.
const int MAGIC_NUMBER = 10;
・関数:呼び出したオブジェクトの持つメンバ変数を変更できなくなる
// 宣言の末尾につける.
int getNumber() const;
※変数、関数いずれもクラスのメンバという前提です
constオブジェクトから呼び出せるのは、constメンバ関数だけです。
OK:constメンバ関数
NG:非constメンバ関数
#Errorの解決法
ということで、Errorの原因となっているメンバ関数に「const修飾子」をつけます。
※末尾につけること!
int getMember() const;
int Sample::getMember() const
{
return member_;
}
「const参照渡し(const参照返しもかな?)」は非常によく使う手法です。
それだけに頻発するErrorなのではないかと思います。
「const参照渡し」を使う時には
「渡したオブジェクト(参照)から呼び出すメンバ関数って、ちゃんとconstついてるかな?」
ということを気にしてみて下さい。