アクセッサにいついて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
シャイニング生ごみ

アクセッサにいついて

#1

投稿記事 by シャイニング生ごみ » 15年前

最近質問させていただきましたシャイニング生ごみと申します。
開発環境はVisualStudio2008 C++ DxLibrary使用です。
C++を学び始めて半年です。

今回質問したいのはアクセッサについてなのですが、そもそもアクセッサはどのようなときに使うのでしょうか。
例えば

コード:

//hogehoge.h

class Car
{
    public:

        void hoge();

        int getGas(){ return gas_ };//ガソリン量を取得
        void setGas( int gas );      //ガソリン量を指定

    private:

        int gas_;

};

//hogehoge.cpp

void Car::setGas( int gas )
{
    if( gas > 0 )
    {
        gas_ = gas;
    }
}

このように使われているアクセッサならば、ガソリン量が負の値になることはないのでバグ回避のために有用だということはわかります。しかし、そのほかの場合ではアクセッサはなんの為に使うのでしょうか。クラス内だけで使う変数をわざわざget()とset()にする必要はないと思いますし、同クラス外でprivate内の値がset()で変更できてしまうのならそもそも変数をprivateにする必要も無い気がします。そこで皆さんにアクセッサの有用な使い方を教えてもらいたく質問をさせて頂きました。どうかよろしくお願いします。

シャイニング生ごみ

Re: アクセッサにいついて

#2

投稿記事 by シャイニング生ごみ » 15年前

すみません先程のコードに間違いがあったため編集したところを記載します

コード:

void Car::setGas( int gas )
{
    if( gas > 0 )
    {
        gas_ = gas;
    }
    else
    {
        printfDx("不正なガソリン量");
    }
} 




アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: アクセッサにいついて

#3

投稿記事 by softya(ソフト屋) » 15年前

大半の理由はこちらで語られている事だと思います。
http://ja.wikipedia.org/wiki/%E3%83%A1% ... 6.E4.BA.89
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

シャイニング生ごみ

Re: アクセッサにいついて

#4

投稿記事 by シャイニング生ごみ » 15年前

softya(ソフト屋)さん 適切な参考リンクを張って頂きありがとうございました。
とても参考になりました、ですがもし良ければ皆さんはどのようにしているか聞かせていただけないでしょうか。
特に聞きたいのは同クラス内でも必ずアクセサを通すべきかどうかということです。
この参考リンクに書いてあったように論争になってしまうようならば即座に止めますのでどうかご助力お願いします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: アクセッサにいついて

#5

投稿記事 by softya(ソフト屋) » 15年前

私論で言えば、ただ変数に入れるだけのアクセッサはカプセル化の観点から内部構造を見せている事になります。
どうしても必要な場合を除き、アクセッサではないメンバ関数の呼び出し引数や演算子のオーバーロードで扱えないか検討して最低限で済ますほうが良いと思います。
クラス内アクセッサは、分かりやすく成るとか安全性が高まるとか意味があるならやるべきですが、積極的にはどうでしょうか?
あとマルチスレッドに対応させるときの同期の観点からバラバラに値がセットされるよりは、設定メンバ関数で一度に設定してもらうほうが都合が良いです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

tk-xleader

Re: アクセッサにいついて

#6

投稿記事 by tk-xleader » 15年前

インターフェイス(C++ではしばし全てのメンバが純粋仮想関数であるクラスで表現します。)にアクセッサを宣言しておき、実装するクラスでそのアクセッサを定義するとか…
「○○というメンバ変数を定義せよ」ということはインターフェイスでは定義できないんですよね。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: アクセッサにいついて

#7

投稿記事 by ISLe » 15年前

個人的には同クラス内のプライベート変数に一対一で対応するアクセッサを作ることはほとんどないですね。
アクセッサが必要になったらそれはクラスとして分ける段階だと考えます。
質問に書かれた例だとGasクラスを作る必要性を感じます。

単純にassertじゃなくてアクセッサで例外を投げるほうがC++的かもしれないという気はします。気がするだけですけど。

シャイニング生ごみ

Re: アクセッサにいついて

#8

投稿記事 by シャイニング生ごみ » 15年前

皆様解答ありがとうございます。個人個人で使い方や考え方が違うのでとても興味深い意見でした。
インターフェイスで宣言する、というのはまだインターフェイスクラスを使っていないのでピンときませんでしたが、今後検討していきたいと思います。今回私が特に納得させられたのがただ変数を入れるだけのアクセッサはカプセル化を妨げてるというものでしたので、しばらくは同一クラス内ではアクセッサを使わずに必要なものだけにアクセッサを用意するということにしました。貴重なご意見をありがとうございました。 今回はこれで解決とさせて頂きますが、是非とも自分はこうしてるよ!等のアドバイスがございましたら書き込んで頂ければ幸いです。
それでは失礼しました。

閉鎖

“C言語何でも質問掲示板” へ戻る