- ベストアンサー
privateなメソッド制限について
- クラスA内に、privateで、staticなメソッド「hogehoge」を作成したいが、変数やパラメータへのアクセスを制限したい。
- 具体的には、クラスA内の変数Xや変数Yへのアクセスを制限したい。
- さらに、他の制限方法(pragmaやdefineなど)も教えていただきたい。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
クラスのメソッドではなく、関数にします。 外からアクセスできないようにしたい場合は、匿名 namespace に入れるか、static 関数にします。 C++の初心者がよく陥る間違いとして、「何でもクラスに入れなければならないと思い込む」というものがあります(Java ではそうなので、Java で勉強すると間違えやすい)。 > 完全に、「hogehoge」の中の変数・Inputパラメータ、Outputパラメータだけで処理をさせたいです。 ということは、hogehoge はクラス A と何の関係もないということであり、しかも private で外からアクセスできないのであれば、クラス A の中に入れる設計は間違いです。
その他の回答 (3)
- rinkun
- ベストアンサー率44% (706/1571)
メンバにアクセスできない関数なら、クラス外の関数にするのが手っ取り早いですけど、 ソースコードにアクセスできるなら何とでもできてしまうので無理でしょう。 # 例えば関数をクラスのfriendにするとか 設計思想からいえば、クラスのメンバ内でアクセス範囲を制限しなければいけないならクラスが大きすぎると言えるでしょう。クラスの分割を考えるべきです。
お礼
ありがとうございます。 確かに、クラスが大きすぎるなと納得しました。 ファンクションにするか、別クラスにしようと思います。
- qwertfk
- ベストアンサー率67% (55/81)
コマンドパターンが一番近いのでしょうか。 class AbstractCommand { public: virtual void hogehoge(int x, int y) = 0; void callHogehoge() { hogehoge(X, Y); } private: static int X, Y; }; このように基底クラスを作っておいて、hogehogeの実装を各自でやってください、という構造にすると、 class Command1 : public AbstractCommand { public: virtual void hogehoge(int x, int y) { /// } }; のようにすると、各クラスの実装では、直接の参照は出来なくなります。
お礼
ありがとうございます。 「直接の参照」をさせない方法は色んな方法があると思いますが、自分の目的は、ちょっと違っています。 ◆求めていること 「クラス内で、Staticメンバーすらも見れないような、閉じた世界のガチガチのクラスを作りたい。」 なのです。 例のようにすれば、直接の参照はできなくなるわけですが、シチェーションとして、逆のことが起こってしまったのです。 自分がスタティックメソッドを作ったのに、 新人さんがそのメソッド内で、スタティックなメンバー変数を参照するように書き換えてしまい、 そういうのをさせないために、質問をした次第だったのです。 「クラス内で、Staticメンバーすらも見れないような、閉じた世界のガチガチのクラスを作りたい。」 のです。
- wormhole
- ベストアンサー率28% (1626/5665)
X, YがクラスAのクラス変数で、hogehogeがクラスAのクラスメソッドだとすると無理かと。 できるとすればhogehogeの処理本体を実装するためのクラス(とメソッド)を別に用意して クラスAのhogehogeはそのクラス(のメソッド)を呼び出すだけにするくらいじゃないでしょうか。
お礼
ありがとうございます。 やっぱり無理でしたかー。。
お礼
ありがとうございます。 > クラスのメソッドではなく、関数にします。 なるほどー。 クラスじゃないとダメなのかと思っていました。 機能がある程度方向性を持っているならクラスにして、 共通的・汎用的な機能は関数にしてみようと思います。