8
1

More than 3 years have passed since last update.

constあるある:「オブジェクトにメンバ関数と互換性のない型修飾子があります」を解消する

Last updated at Posted at 2020-06-04

頻発ミス

VisualStudioで、こんなErrorが出たことはありませんか?
 オブジェクトにメンバ関数と互換性のない型修飾子があります

ちょっと例を出してみましょう。

Sample.h

class Sample
{
private:
    int member_;

public:
    // constructorとかsetterとかは省略しています. 
    Sample(const Sample& argSample);
    int getMember();
};
Sample.cpp
#include "Sample.h"

Sample::Sample(const Sample& argSample)
{
    member_ = argSample.getMember();
}

int Sample::getMember()
{
    return member_;
}

・・・さて、こんな感じのコードだと、イントロにあるようなErrorが出てきてしまいます。
原因は一体何でしょうか?

Errorの原因

このメンバ関数では「const参照渡し」をしていますね。

Sample.h
    Sample(const Sample& argSample);
Sample.cpp
Sample::Sample(const Sample& argSample)
{
    member_ = argSample.getMember();
}

・・・ん?
このメンバ関数があかんことになっていますね。

Sample.h

    int getMember();
Sample.cpp

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修飾子」をつけます。
※末尾につけること!

Sample.h

    int getMember() const;
Sample.cpp

int Sample::getMember() const
{
    return member_;
}

「const参照渡し(const参照返しもかな?)」は非常によく使う手法です。
それだけに頻発するErrorなのではないかと思います。
「const参照渡し」を使う時には
 「渡したオブジェクト(参照)から呼び出すメンバ関数って、ちゃんとconstついてるかな?」
ということを気にしてみて下さい。

8
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
1