• 締切済み

複数クラスで共通の関数、変数の呼び出し方

お世話になります。 質問させて頂きたいことは 複数のクラスで共通して使われる関数、変数があった場合、その関数、変数は私の中で次の2通りの方法が思い当たったのですがどちらのほうがメモリ等の使用からよいのでしょうか? 1つめは あるヘッダファイル****.hを作成し、その中で関数を宣言し、変数はそのヘッダファイルのソースファイル中のグローバル変数とする。 2つめは クラスを作成し、静的メンバ関数、静的メンバ変数とする。 ネット等で拝見すると、あまりグローバル変数というのはよく見られていないようなので2つめの方がいいのかなと思っているのですが、静的メンバを今まで使ったことがないので、このような用途に使われるべきなのかも正直わかっていません。 検討外れのことを言っているのかもしれませんが、教えて頂ければと思っております。宜しくお願い致します。

みんなの回答

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.6

>静的関数のみなので、インスタンスを作ってはいけないというのはわかるのですが、スレッドや割り込みで使ってはいけないというのはなぜでしょうか?グローバル関数、変数とほとんど大差がないような気がするのですが。。。 失礼。少し失言でした。 クリティカルセクション等でガードすれば問題なく使えます。 >CだとMFCのような画面構成の作成ができない為、ちょっとCには出来ないです。 ??? C言語の関数記述はC++コンパイラでも使えます。当然、VC++でも使えますよ。 int sub(int in) { return in+1; } をメンバ関数から呼び出せます。 int class::member(int in) { return sub(in); }

fujtomo
質問者

お礼

>クリティカルセクション等でガードすれば問題なく使えます。 なるほど、グローバル変数・関数と同じように衝突しないように気をつけろということですね。 C言語の記述をVCに書いては、という話だったんですね。 勘違いして、Cのみで作成しては、という話かと思ってしまいました。理解不足でした。 ヒープということは、mallocとかをつかってメモリ確保しては?という話なのでしょうか?

すると、全ての回答が全文表示されます。
回答No.5

メモリの使用量ですが、大差ないです。 この場合は、デザイン(設計)を重視するべきじゃないですかね。 なんなく、継承とかよりも、単独のオブジェクトとした方が よさげな予感はします。 あとは、シングルトンなり、コンポジットなり用途次第で。。。 ちなみに、プログラム実行時には、 当然実行ファイル自体のファイルサイズ分メモリを使用しますから C++を選択する時点でメモリの使用量はおさえられないと考えた方がよいです。 ということで、メモリ使用量を抑えたいというのならば、 Cで、ヒープ使うのが一番無難じゃないですか? # s/レジスタ/レジストリ/ とか思ってみる今日この頃

fujtomo
質問者

お礼

クラスの継承は共通の動作をする関数が複数のクラスで必要な場合に有効なようですね。 よくよく考えてみたら、それぞれのクラスでレジストリの読み書きという処理は同じですが、レジストリの保存先や、読み込んできたデータを格納する構造体が違っているため継承は今回のプログラムには向いていないみたいです。 CだとMFCのような画面構成の作成ができない為、ちょっとCには出来ないです。。 ご回答ありがとうございました。

すると、全ての回答が全文表示されます。
  • zwi
  • ベストアンサー率56% (730/1282)
回答No.4

決してインスタンスを作らない&スレッドや割り込みで使わない事さえ心がければ罠は無いとは思います。将来誰かの手でメンテされる可能性があるならコメントで正確に記載しておいてください。ただ、私の感想としてはクラスとしては気持ち悪いですね。

fujtomo
質問者

お礼

やはりクラスとしては気持ち悪いですよね。 私も出来上がったクラスの整然と並んでるstaticを見て、不気味に感じました。。 >決してインスタンスを作らない&スレッドや割り込みで使わない事さえ心がければ罠は無いとは思います 静的関数のみなので、インスタンスを作ってはいけないというのはわかるのですが、スレッドや割り込みで使ってはいけないというのはなぜでしょうか?グローバル関数、変数とほとんど大差がないような気がするのですが。。。 ご回答宜しくお願い致します。

すると、全ての回答が全文表示されます。
  • zwi
  • ベストアンサー率56% (730/1282)
回答No.3

>今回質問させて頂いた関数というのはレジスタに設定データを書き込んだり、読み込んだりする関数で、変数というのはその設定データを一時的に格納する構造体なんです。 レジスタ?って事はマイコン?ですかね。周辺IOの制御レジスタだと思うんですが。メモリ消費を抑えたいという点からもマイコンっぽいですが。 設定データの受け渡しなら構造体パラメータを読み書きの関数に渡すのはだめなんでしょうか?わざわざグローバル変数である意味が分かりません。 それとインスタンスはスコープ外に出ればメモリから消滅しますので、ローカル変数で宣言すればその関数を抜ければ消滅します。 それでもメモリ消費が多いというなら、C言語の関数で書いたほうがメモリが少ないかも知れません。 ちなみにstaticな関数や変数だとインスタンス関係なしに実態が存在する事になります。まぁ単なるC関数と変数と同じでクラス名::メンバ名でアクセス出来てしまいます。

fujtomo
質問者

お礼

レジスタといってもマイコンでありません、組み込み機器のアプリケーションを開発しています。 ただ、通常のPCではなく組み込み機器用のOSで開発している為、メモリに対しては敏感であったほうがいいと思い、プログラムでのメモリの消費を気にしています。 レジスタに変数を格納するのは、一度機器の電源が切れても設定データを保持させたい為です。 おっしゃる通りstaticな関数、変数だとインスタンスを関係なく使用できるため、インスタンス用にメモリを消費させなくて良いと思ったため、静的関数・変数にこだわってみました。 とりあえずは静的関数、変数でプログラムを作ってみたのですが、静的関数・変数を使うことで生じる問題等ということはりますでしょうか? 重ねての質問で申し訳ありませんが、お答え頂ければと思っております。

すると、全ての回答が全文表示されます。
  • titokani
  • ベストアンサー率19% (341/1726)
回答No.2

私だったら、その共通の関数をメンバとして持つクラスを作って、それを継承して使うことを考えます。 単純な継承でもいいし、多重継承もありでしょう。

fujtomo
質問者

お礼

その前の方に対しても説明させて頂いたのですが、共通の関数というのがレジスタの読み書きをする関数、変数はそれを一時的に保存する構造体なのですが、そのような関数でも継承を使うことが有効なのでしょうか? 継承はほとんど触れておらず、なんとなくのイメージしかもっていないのですが、もし継承した場合だと、子のクラスは親のクラスの関数(今でいうレジスタ操作の関数)をメモリ消費なしに普通に呼び出せるのでしょうか?

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

本当に共通して使われる関数があるなら単なるC言語的な関数で良いと思いますのでクラス化する必要は有りません。ただし、データ保持する変数と組になる関数であるならばクラス化を考えてください。 例えば日付を処理する関数と日付を保持する変数があるなら、それは1つのオブジェクトで1つのクラスとすべきです。 >ネット等で拝見すると、あまりグローバル変数というのはよく見られていないようなので2つめの方がいいのかなと思っているのですが、 安易なグローバル変数を避けることはコードの見通しやバグの削減につながるので良いことですが、むやみにグローバル変数をやめて逆に複雑になるなら避けたほうが良いです。 と言うことで私の答えは1でも2でも無い3です。 変数と関数を組とした1つのクラスとして、そのクラスのインスタンスをグローバル変数として宣言してください。

fujtomo
質問者

お礼

今回質問させて頂いた関数というのはレジスタに設定データを書き込んだり、読み込んだりする関数で、変数というのはその設定データを一時的に格納する構造体なんです。 静的関数、静的変数を考える前はおっしゃるようにこれらを1つのクラスとし、クラスのインスタンスを作成していたのですが、それだとそのインスタンスが開放されるまでインスタンス分メモリがとられてしまう為、なるべくメモリの消費をしないようなプログラムにしようと思っています。それで今回のようなことを考えてみたのですが。。 これだと、クラスの中身が静的変数と静的関数のみで、これでいいのだろうかと不安に感じているのですが、やはり普通にクラスにし、インスタンスを作成するのが妥当なのでしょうか?

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

関連するQ&A