ページ 11

constを付けるべきか

Posted: 2012年12月09日(日) 15:36
by dom
 私はクラスのメンバ関数に対して、constを付けられるなら付けるというコーディングをしていました。
つまり、メンバを変更しないものには必ずconstを付けていました。
 以下のようなクラスの場合、メンバ変数は変更しないものの、その後のクラスの挙動は変わっていしまいます。
constは付けるべきでしょうか?

コード:

#include "HogeLib.h"

class Hoge
{
public:
    void setColor(...)  // <-- constを付けるべきか?
    {
      HogeLib::SetColor(...);  // ライブラリの状態を変更する
    }    

    void draw() 
    {
         ...
         HogeLib::Draw(); // setColorの色で描画
         ...
    }
};

Re: constを付けるべきか

Posted: 2012年12月09日(日) 21:45
by GRAM
場合にもよるとおもいますが、そもそも論で
そこが気になるのであればラッパを一回かませればいいんじゃないかと思います。

コード:

#include <iostream>

class HogeLibWrapper
{
public:
	void SetColor(...)
	{
		HogeLib::SetColor(...);
	}

	void Draw() const
	{
		HogeLib::Draw();
	}
};

class Hoge
{
private:
	HogeLibWrapper hogeLib_;
public:
    void setColor()
    {
		hogeLib_.SetColor(...);
    }    
 
    void draw() const
    {
         hogeLib_.Draw();
    }

};
setColorがconst修飾されていれば、コンパイルエラーになります。

Re: constを付けるべきか

Posted: 2012年12月10日(月) 20:58
by beatle
DXライブラリのように、内部状態を持つライブラリは場合によって使い難いですよね。
GRAMさんも「場合による」と仰るように、constの意味が曖昧なのが問題なんですね。
「意味的な不変性」と「ビットレベルでの不変性」ですね。

個人的に普段は、constが付いたメンバ関数は外から見た挙動を変えないことを期待するので、「意味的な不変性」支持派ですかね。

Re: constを付けるべきか

Posted: 2012年12月10日(月) 21:46
by dom
返信ありがとうございます。
「意味的な不変性」と「ビットレベルでの不変性」ですか、参考になりました!