• ベストアンサー

クラスについて

C++を勉強中です。 本にかいてあるクラスの使い方はわかったのですが 自分でプログラムを作成していて 疑問に思ったことがあります。 クラスの変数をパブリックとかプライベートに しますよね。 使う意味はわかるし必要性もわかるのですが、個人で作っている時、 プライベートの変数って作っているのですか? オールパブリックのほうが作りやすいと思ってしまいます。 またそれならクラス自体必要ではなくなってしまいます。 ここをどう理解していけばいいのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • bikkuri
  • ベストアンサー率33% (23/68)
回答No.2

メソッドを用意しなくても直接参照/設定すれば、 ことが足りる場合は、パブリック/プライベートの選択は 個人の場合、難しいですね。(ルールは自分なので) あえて言えば、将来性をどの程度考慮するかでしょう。 あと、クラスの機能が変数主体(=従来の構造体のような使い方)から 機能主体(メソッドが充実)になれば、直接外部から参照/設定したい 変数は減ってきます。 そのとき、内部でしか使用しない変数は自然と プライベートになるでしょう。

tomojyuu
質問者

お礼

回答ありがとうございます。 非常にわかりやすい説明ですね。 ルールは自分なので...そうなんです。 そういうことがいいたかったのです。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.3

tomojyuuさん、今晩は。「使う意味はわかるし必要性もわかる」とあるので、蛇足かもしれませんが、私自身の事を書きます。私は、個人的な趣味のための プログラムを作っています。 私は、メンバー変数をpublicにした事はありません。 クラスメンバーは整合性が取れてなければなりません よね。例えば、 class X { int* dataptr;   int size; // dataptrの有効データ数を保持 }; このような場合、もしsizeをpublicにしていると、外部から変更できて、インスタンスの状態が不正になり得ますよね。 このため、私はpublicメンバーを持つクラスはまともなクラスとは思っておりません。 例え個人的なプログラムの場合で有ってもです。 多少作りにくいということは言えるかもしれませんが、それはまともなクラスを作るための当然のコストだと思っています。

tomojyuu
質問者

お礼

回答ありがとうございます。 外部から変更しなければいい(自分のルール) と思ってしまうとプログラムが動けばよいと なってしまいますね。 graphaffineさんみたいな意見がでると思って いました。

全文を見る
すると、全ての回答が全文表示されます。
  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.1

非常に本質的な質問だと思います。 たしかにパブリックにした方が作りやすいでしょう。 「オブジェクト指向」の観点からすると、なるべくプライベートにする方が望ましいのです。 ただ、個人で作る規模のプログラムにオブジェクト指向を採用すると、かえって効率が悪くなることがあります。 ここで「オブジェクト指向」の意味に戻って考えてみます。 オブジェクト指向は、大規模プログラミングのために開発された手法です。 小さいプログラムなら、オブジェクト指向でも、そうでなくても、プログラムは作れます。 大きいプログラムになるとオブジェクト指向が力を発揮します。 オブジェクト指向は一つの流儀です。 ある流儀にコミットする場合、 そこで言われたことはとりあえず意味がある、と思わないとやっていけないでしょう。 変数をプライベートにするのは「情報隠蔽」という、 オブジェクト指向の(実はそれ以前からの)、「作法」の一つです。 多数のプログラマが研究して、「そうした方がいい」と結論づけられました。 すぐにはわからないかもしれませんが、 情報隠蔽には意味があることは知っていてください。 将来、自分でプログラム設計をして、情報隠蔽を使ったときと使っていないときを比べれば、 どういう意味かわかるときが来ると思います。

tomojyuu
質問者

補足

回答ありがとうございます。 大きいプログラムを分担で作る時、力を 発揮するのですね。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • クラスの分割

    画像処理のプログラムを書いているのですが、1つのクラスに必要な変数と関数をぶち込んだため、変数20~、関数20~、2000行くらいのクラスになっています。 このままでは見辛いので、クラスを処理ごとに分割して見易くしたいのですが、各関数でいくつか共通の変数を使用しているため上手く分割ができなくて困っています。 データのみのクラスを継承した子クラスを3つ作ってみたらインスタンスが3つできてしまい意味がありませんでした。 ↓の図に示すようなクラスを作りたいのですが、いくつか質問をさせてください       共通データクラス     /    |    \   子クラスA 子クラスB 子クラスC 1、変数20~、関数20~、2000行くらいのクラスは普通でしょうか?(分割する必要がありますか?) 2、↑の図はクラスの作り方として問題がありますか? 3、2で問題がない場合実現する方法として、仮想継承、関数に共通データのポインタを渡す以外に方法があるかどうか まだまだC++を勉強中で、便利な構造体程度にしか使えていませんが、どなたかご教授お願いします。

  • VC#2010 クラスの実体化について

    こんにちは、 現在の環境はWindows7でVisualStudio2010を使用しています。 最近 Cシャープを勉強し始め、疑問に思い質問させていただきました。 クラスを作成し、そのクラスの実体化を行わないで、 クラスのメンバ変数やメンバ関数などがエラーなく使えてしまいました。 C++のときはビルドエラーになっていたのにCシャープでは 実体化を行わなくてもよいと言いうことですか? 回答お願いします

  • クラス型のメンバ変数について

    クラス型のメンバ変数って、どういったメリットがあるのでしょうか? 以下のプログラムは疑問点の部分だけ書いたプログラムです。 class Caaa { (内容) }; class Cbbb { protected: Caaa m_bbb; } 上のプログラムの、 Caaa m_bbb; の部分が、どういった意味(使い道)があるのかわかりません。 int型やvoid型のメンバ変数は分かるのですが、他のクラスの型をもったメンバ変数はどういった意味があるのでしょうか。 どなたが教えてください。

  • クラス変数とクラスメソッドを教えてください

    みんさんどうもすみません。クラス変数とクラスメソッドなんですが、 何回本を読んでもイマイチ理解できません。クラス変数とクラスメソッド を使うことでなにがメリットなのか教えてください。例えばクラスメソッド の場合はメソッド名の前にオブジェクト名をつけなくていいとか、そういう 便利さのために使うんでしょうか?どうもまだ完全に理解できていないの で詳しい方いらっしゃったらどうか教えてください。よろしくお願いします。

    • ベストアンサー
    • Java
  • C++のクラス設計について

    Webや書籍をあたってみたのですが、なかなか解決しないので こちらで相談させいただこうと思い立ちました。 C++で書かれたプログラムを解析しているのですが、 ドキュメントは外部仕様書のみであとはソースコードだけ、という状態です。 コメントもほとんど書かれていないコードについて、リバースエンジニアリングを する必要があり、手始めにクラス図を作成してみました。 すると、複数のクラスでメンバ変数が重複しているのです。 クラスAに、クラスB・C・Dの変数の一部が宣言されていて、 クラスAとクラスBの間で重複している変数はすべてどちらのクラスもprotectedのstatic、 クラスAとクラスC・Dの間で重複している変数はクラスAではprotectedのstatic、 C・Dではprivateです。 クラスBとC・Dは継承関係にありますが、メンバ変数の重複はありません。 クラスAと他クラスは継承関係がなく、メンバ変数が多数重複しています。 クラスAの変数は20個ほどありますが、9割以上がB・C・Dで宣言されている変数と 重複している状態で、かつstaticのprotectedです。 Cはわかるのですが、C++はほとんど書いたことがありません。 アンチパターンなどもあたってみたのですが、上記のような設計についての記述は 見つけられませんでした。こういったクラス間での変数重複は「あり」なのでしょうか? これで情報が足りているかわかりませんが、何卒よろしくお願い致します。

  • クラス別ネットワーク数について

    こんにちは。いつもお世話になっております。 今まで当然と思っていたことに疑問が湧いてしまいました。 IPアドレスのクラスによって、ネットワーク数、ホスト数が 異なりますが、 ◆クラスAの場合 ネットワーク数は、2^7-2=126 ですが、マイナス2の意味は 0と127が使用できないからだと理解していました。 ◆クラスBの場合 ネットワーク数は、2^14-2=16,382 と同じ計算方法を している本ばかりなのですが、自分が研修を受けたときの テキストを開くと「クラスBとC の場合は、使用できない 値はありません」と書いてあります。 つまり、2をマイナスする必要はないということです。 どちらが正しいのでしょうか? ホスト数に関しては、オールゼロ、オール1を使えないので 常にマイナス2ということは、分かります。 よろしくお願い申し上げます。

  • 新規クラスの使い方

    <環境> WIN98 VC++6.0 MFC  デフォルトでプロジェクトを作成。 オリジナルの新規クラスを作成。 新規クラス内でXXview.h内で宣言した変数を使いたいので 新規クラス内で#include <XXview.h>とすると、 error C2143: 構文エラー : ';' が '*' の前に必要です。等のエラーが出ます。 これを回避する方法を教えてください。

  • ユーザー定義関数とクラスの違いとは?

    間違えて違うカテゴリーに質問してしまったので、 そちらを削除して、質問させていただきます(レスも幸いなかったため)。 PHPを勉強して1ヶ月の初心者です。 ホームページを作ろうとして、本に書いてあったプログラムを元に、 付け足したり、削ったりしていました。 そして、プログラムが長くなってきたので、外部ファイルに処理を分割してみました。 どの本にも、「クラス」「オブジェクト指向」という言葉が強調されていたので、 とりあえずクラスにしてみました。 しかし、クラスの中で処理をした変数を取り出すのが手間に感じます (クラス内では「$this->変数名」、クラス外では「$クラス名->変数名」と書く手間が・・・)。 本の中には、クラスを使わずに、 ユーザー定義関数のみのfunctionをまとめた外部ファイルを 作成している例が多い気がします。 そこで質問なのですが、 処理を分割して外部ファイルにするとき、 「メソッドをまとめたクラス」にした方がいいのでしょうか? それとも、「ユーザー定義関数をまとめたもの」にした方がいいのでしょうか? また、「こうゆう場合は、クラスにした方がいい」「ユーザー定義関数にした方がいい」などの 条件がありましたら、教えていただきたいです。 本やネットを調べても、使い分けについて書かれているページがなく、 今後の作成のためにも、ぜひ知っておきたいです。 すべてクラスにした方が今後よいようでしたら、全部クラスのままで作れるよう、 慣れていきたいとも思ってもいます。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • クラスモジュールについて

    VBを勉強し始めた初心者です。 標準モジュールについては何とかわかるようになってきましたが、クラスモジュールについては、ほとんどわかりません。 クラスモジュールの意味や、プログラム法について初心向けにわかりやすく書いた本等がありましたら、ご紹介下さい。

  • Java:クラスのインスタンスを配列の要素にする?

    問題集で次のプログラムを見掛ました。 A[] array = {new B(), new C()}; クラスA型の配列変数arrayにクラスBとクラスCのインスタンスを要素として代入しています。 このような配列を作成した場合、具体的にどのような使い方があるのでしょうか? 簡単なプログラムを書いて頂けると嬉しいです。 よろしくお願いします。

このQ&Aのポイント
  • Lenovo Yoga L13で複数のディスプレイを接続しようとすると、接続したディスプレイが認識されない問題が発生します。
  • 1枚ずつのディスプレイならば、HDMIポートまたはType-Cポートのどちらでも正常に認識されます。
  • しかし、両方のポートに接続しようとすると、HDMIポートに接続していたディスプレイが認識されなくなります。解決方法はあるのでしょうか。
回答を見る