グローバル変数、関数を全てのクラスでインクルードしたい。 – プログラミング – Home

グローバル変数、関数を全てのクラスでイ...
 
通知
すべてクリア

[解決済] グローバル変数、関数を全てのクラスでインクルードしたい。

固定ページ 1 / 2

オリバ
 オリバ
(@オリバ)
ゲスト
結合: 18年前
投稿: 25
Topic starter  

VC6 XPです。

メインダイアログクラスCMainDlg
メインダイアログから表示されるCChildADlg、CChildBDlg
と3つのクラスがあります。

さらに
GenericクラスCgenを作成しました。
このクラスはCMainDlg、CChildADlg、CChildBDlgで使いたいです。
よって、
インクルードしたいんですが、
StdAfx.hでgen.hをインクルードするのが普通ですか?
さらにこのとき、CChildADlgのメンバにCgen pGen;
を宣言するとエラーになります。

上と似た関係で
グローバルヘッダファイル(変数やデファイン定義を宣言)を全クラスから
コールするにはどのようにインクルードすればよいですか?


引用未解決
トピックタグ
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

「普通か」という疑問に答えるためには母数のでっかいアンケートが必要。
俺の意見はあくまで俺の意見であって「普通か」の答えとはなりえない。
というわけで以下俺意見。

stdafx.h に自作の gen.h を #include したりはしない。
stdafx.h 中で #include するのは「まず絶対に変更の無い」ファイルのみ。
すなわち Windows/VisualC++ 側が用意したもの、ということは簡単に言うと
#include <....> と <> で囲むべきもののみ。

gen.h はもう完成済みで絶対に変更しない!ということならば
stdafx.h 中に書く、という人はいるかもしれないけど、俺はやんない。
普通に CMainDlg.cpp 中に #include gen.h するべし。
っていうかそういう「共通」なものが本当に必要?
グローバル変数なんてのは使わないに限るんだけど。
resource.h なんかは共通に使うけど、変更が多いから stdafx.h には書かない。

あと、エラーになる、って何エラーかわからんのにアドバイスできんよ。


返信引用
オリバ
 オリバ
(@オリバ)
ゲスト
結合: 18年前
投稿: 25
Topic starter  

Cgenのクラスで状態遷移関数(50遷移ぐらい)を用意し、
CChildADlg、CChildBDlgでは同じ状態遷移を実行します。
違いは、パラメータ2つのみ。
だから、CChildADlg、CChildBDlgの両方に同じ記述をするのは時間もかかるし
無駄だと思ったのでこのような方法にしました。

>stdafx.h 中で #include するのは「まず絶対に変更の無い」ファイルのみ。
こういう意識はありました。

エラー内容は以下の通りです。
構文エラー : ';' が、識別子 'pGen' の前に必要です。
error C2501: 'Cgen' : 識別名を宣言するのに、型が指定されていません。
error C2501: 'pGen' : 識別名を宣言するのに、型が指定されていません。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

> エラー内容は以下の通りです。
そのクラス(CChildADlg)のヘッダに #include gen.h と記述していないのでしょう
か?


返信引用
オリバ
 オリバ
(@オリバ)
ゲスト
結合: 18年前
投稿: 25
Topic starter  

インクルードがらみでもうひとつ質問があるのですが・・・

クラスをたくさん作るとStdAfx.cなどがあるフォルダの直下に
ファイルがたくさんできてしまします。
そこで機能ごとにフォルダを作成し、そのフォルダの直下にファイルをおきました。
そのクラスのCファイルでも先頭でStdAfx.hをインクルードしてますが、
パスが違うため../StdAfx.hとしないとだめなのでは?
しかし、このようにすると

fatal error C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。

というエラーになります。
パスが違うのに
StdAfx.hだとエラーになりません。
なぜでしょうか?


返信引用
オリバ
 オリバ
(@オリバ)
ゲスト
結合: 18年前
投稿: 25
Topic starter  

>そのクラス(CChildADlg)のヘッダに #include gen.h と記述していないのでしょう
>か?

してないですよ。
今してみましたが、同じ結果でした。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

>してないですよ。
しなければ、CChildADlgがCgenってクラスが何者かわからないのでコンパイルできなく
て当然です。

>今してみましたが、同じ結果でした。
そんなことないと思いますが。一度リビルドしてみてはどうでしょうか?

>パスが違うのに
>StdAfx.hだとエラーになりません。
おそらく、コンパイル時にそのcppを基準に見てコンパイルしないからではないでしょう
か?
(たとえばdwpがあるフォルダを基準にしているとか。)


返信引用
オリバ
 オリバ
(@オリバ)
ゲスト
結合: 18年前
投稿: 25
Topic starter  

StdAfx.hでgen.hをインクルードし、
CChildADlgのメンバ変数に
CGen m_CGen;
を宣言し、
CChildADlgクラス内でアクセスすることができました。

>おそらく、コンパイル時にそのcppを基準に見てコンパイルしないからではないでしょ
>うか?
多分そんな感じなんでしょうね!
ということは、StdAfx.hの階層にフォルダを作成し、そのフォルダ内に
クラスのcpp,hを置いても問題ないということですね?
クラスがたくさん増えると整理したくなります。。。
1つのフォルダだときたなくみえて!
ファイルを探すのも大変ですし!


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

ちなみになんですが、

今言われているCgenと言うクラスに関しては別にグローバル変数と言うわけでも
無いみたいですね。単にとあるクラスを他のクラスのメンバーに使いたいと言う
事だけに見えます。私なら各クラスのヘッダーにインクルードしちゃうでしょうね。
その方が転用する時は都合が良いので。

プリコンパイルヘッダーを使用するにしている時に変更が多いヘッダーファイルを
Stdafx.hにインクルードしてると毎回プリコンパイルヘッダーの作り直しが行われるので
プリコンパイルヘッダーを使っている魅力が半減するかもしれません。
それでもソースファイル毎で無くなるからマシではありますが。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

「Stdafx.h」でなく、アプリケーションクラス(CWinAppクラス)のヘッダファイル
に加えてみたらどうでしょうか。
 AppWizardでスケルトンを作成すれば、個々のクラスで定義されるはずです。
「Stdafx.h」はVisualCが管理しているヘッダーファイルです。
普通、SDK等で使うヘッダーファイル、MFCのヘッダファイル「Afx」で始まるヘッダファイルです。


返信引用
オリバ
 オリバ
(@オリバ)
ゲスト
結合: 18年前
投稿: 25
Topic starter  

>ちなみになんですが、

>今言われているCgenと言うクラスに関しては別にグローバル変数と言うわけでも
>無いみたいですね。単にとあるクラスを他のクラスのメンバーに使いたいと言う
>事だけに見えます。私なら各クラスのヘッダーにインクルードしちゃうでしょうね。
>その方が転用する時は都合が良いので。

詳しく説明するとメインダイアログにボタンが10個あります。
このボタン押下でそれぞれのダイアログが表示されます。

上で示したジェネリッククラスは
この10個のダイアログクラスのうち8個で使用されます。
また、同じように8個のダイアログクラスで共通に使用する
ジェネリッククラスが10個ぐらいあります。

このような状況ではジェネリッククラスの定義を
どのようにするのが妥当でしょうか?


返信引用
たいちう
 たいちう
(@たいちう)
ゲスト
結合: 23年前
投稿: 662
 

> このような状況ではジェネリッククラスの定義を
> どのようにするのが妥当でしょうか?

妥当性を考えるには、ジェネリッククラスについての情報不足。

> 上で示したジェネリッククラスは
> この10個のダイアログクラスのうち8個で使用されます。

多くのダイアログクラスが同じようなイベントハンドラを
持っているような印象を受けます。
私ならダイアログクラスの基底クラスを検討すると思う。

> また、同じように8個のダイアログクラスで共通に使用する
> ジェネリッククラスが10個ぐらいあります。

もしかして、複数のダイアログクラスから、
共通のジェネリッククラスのインスタンスを見たいって事?

その場合、ダイアログの基底クラスのスタティックメンバとして持つか、
ジェネリッククラスのメンバをスタティックにする。

いずれにしろ、これ以上は情報不足。何をしたいのか書いてください。

# 私の書いてることが判りにくければ...
http://www1.kcn.ne.jp/~robe/cpphtml/html02/cpp02028.html


返信引用
oid
 oid
(@oid)
ゲスト
結合: 18年前
投稿: 1
 

それぞれのクラスが完全に独立してて
しかも、横の情報のつながりが無くて良いなら、

その何十個もあるラス全部を継承したクラスをがんばって作って
それひとつをインクルードするとかw

ハードルも高そうですが、すっきりするかもよ?


返信引用
オリバ
 オリバ
(@オリバ)
ゲスト
結合: 18年前
投稿: 25
Topic starter  

詳しく説明します。
このアプリは基板の単体調整用ソフトです。

メインダイアログにあるボタンを押下することにより各基板のダイアログが表示されま
す。
基板は全部で9種類。
各基板の試験項目は20種類ほど。(基板により異なる)
各基板のダイアログに各試験項目のボタンを用意し、
ボタンを押下することにより、試験を開始し、
結果をリストボックスに表示します。
各基板ダイアログのOnTimerで状態遷移をします。
その時に共通の試験項目が10種類ほどあります。
例えば、メモリテストなど・・(試験範囲とアドレスが異なるのみ)
この試験をジェネリッククラスで状態遷移させ、
各基板ダイアログクラスから共通にアクセスしようとしています。
試験範囲などのパラメータを各基板ダイアログクラスから渡せば
試験の状態遷移は共通化することができます。


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

いや、だからフツーに #include すりゃいいぢゃん。
stdafx.h に書くのは個人的には絶対却下なので、こんな感じ。

--- generic.h ---
class generic_helper {...};
--- hoge1.h ---
#include generic.h
class CHogeDialog : public CDialog { ...
generic_helper x;
};
--- hoge1.cpp ---
#include StdAfx.h
#include hoge1.h
...

必要なところにきっちり #include を記述すれば正しく動く。

もし何かが正しく動かないとしたら、それはソースコードの記述が悪い。
・#include の順番/位置が悪いとか
・多重 #include に対応してない記述してるとか
・#include StdAfx.h より前に何か書いてるとか

ソース開示なしには一般論しか言えないのであとはがんばってくれ。

「共通のなんたら」がいっぱいあるならたいちうさんのご意見を参考にしませう。


返信引用
固定ページ 1 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました