none
複数のクラスで共通に使う変数を作成するには RRS feed

  • 質問

  • いつもお世話になっております、鏑木です。
    現在、Visual Studio 2005にてVC++のアプリケーションを開発しており、そこで質問
    させて頂きたいことがあったため、こちらにて質問させて頂きます。よろしくお願いいたします。

    現在開発しているアプリケーションはダイアログベースのアプリケーションnで、複数のクラス
    を使用しています。複数のクラスで作成されるコマンドをグローバル配列・グローバル変数に
    保存して、なおかつその状態を保持して、他のクラスでそのグローバル配列・グローバル変数を
    使いたいと思っています。
    そこで私は、各クラスで共通にあるヘッダーファイル(main.hと仮定します)を呼び出し、そのmain.h
    内で
    static char hairetu[10];
    static int index;
    のように宣言して使用していました。
    しかし、どうもこの方法ですとあるクラスではhairetuに変数を代入できますが、別のクラスでは代入
    されていないといった状況が起きています。
    そこで質問なのですが、このように複数のクラスで共通の配列や変数を使用する場合にはどのように
    宣言すればよいでしょうか?
    参考となるご意見をお待ちしております。

    尚、開発環境は
    Windows CE 6.0
    Visual Studio 2005
    です。
    よろしくお願いいたします。
    2009年9月15日 7:42

回答

  • ヘッダ内へ上記のように書くと、ヘッダをインクルードしたソースファイル別に変数が定義されてしまいます。(indexがたくさん存在している)

    宣言と実態を.hと.cppに記述しましょう。

    たとえば、
    define.cpp
    #include "stdafx.h"
    #include "define.h"
    char hairetu[10];
    int index;

    define.h
    #pragma once
    extern char hairetu[10];
    extern int index;

    変数を参照するファイルへdefine.hをインクルードする。

    アプリケーションクラスのtheAppを参照してください。
    .cpp
    CHogeApp theApp;

    .h
    extern CHogeApp theApp;

    • 回答としてマーク 鏑木肆星 2009年9月16日 0:06
    2009年9月15日 8:26
  • しかし、他のクラスBから、変数を宣言しているmain.hをインクルードし、
    ここまではいいのですが、
    そのクラスBのソースファイル内に
    char hairetu[10];
    int index;
    と書くと、クラスAとクラスBでおなじグローバル変数を宣言していると、エラーがでてしまいました。
    これが余計です。

    クラスAのソースファイル内にすでに定義しているのであれば、
    それをmail.hの宣言を使って参照すればいいのであって、
    クラスBにも書いてしまっては、同じグローバル変数を定義しているとエラーが出るのは当たり前です。
    • 回答としてマーク 鏑木肆星 2009年9月16日 0:06
    2009年9月15日 9:23

すべての返信

  • ヘッダ内へ上記のように書くと、ヘッダをインクルードしたソースファイル別に変数が定義されてしまいます。(indexがたくさん存在している)

    宣言と実態を.hと.cppに記述しましょう。

    たとえば、
    define.cpp
    #include "stdafx.h"
    #include "define.h"
    char hairetu[10];
    int index;

    define.h
    #pragma once
    extern char hairetu[10];
    extern int index;

    変数を参照するファイルへdefine.hをインクルードする。

    アプリケーションクラスのtheAppを参照してください。
    .cpp
    CHogeApp theApp;

    .h
    extern CHogeApp theApp;

    • 回答としてマーク 鏑木肆星 2009年9月16日 0:06
    2009年9月15日 8:26
  • myoko2様、ご回答ありがとうございます。

    教えて頂いたようにヘッダーファイルには変数の宣言、ソースファイルには変数の定義
    のように作成してみました。
    結果としては、あるクラスAから、変数を宣言しているヘッダー(main.h)をインクルードし、
    そのクラスAのソースファイル内に
    char hairetu[10];
    int index;
    と書く分にはエラーはありませんでした。
    しかし、他のクラスBから、変数を宣言しているmain.hをインクルードし、
    そのクラスBのソースファイル内に
    char hairetu[10];
    int index;
    と書くと、クラスAとクラスBでおなじグローバル変数を宣言していると、エラーがでてしまいました。
    これは私の変数の呼び出し方が間違えているためでしょうか?
    もしそうであれば、教えていただければと思います。

    鏑木
    2009年9月15日 9:07
  • しかし、他のクラスBから、変数を宣言しているmain.hをインクルードし、
    ここまではいいのですが、
    そのクラスBのソースファイル内に
    char hairetu[10];
    int index;
    と書くと、クラスAとクラスBでおなじグローバル変数を宣言していると、エラーがでてしまいました。
    これが余計です。

    クラスAのソースファイル内にすでに定義しているのであれば、
    それをmail.hの宣言を使って参照すればいいのであって、
    クラスBにも書いてしまっては、同じグローバル変数を定義しているとエラーが出るのは当たり前です。
    • 回答としてマーク 鏑木肆星 2009年9月16日 0:06
    2009年9月15日 9:23
  • クラスBのソースファイルは、main.hをインクルードした後は、
    hairetu[1] = 1;
    hairetu[3] = 32;
    if( index == 7){
    }
    など、いきなりアクセスしてください。
    2009年9月15日 9:39
  • Atsushi777様、いつもご回答ありがとうございます。

    どうも的はずれな回答をしているみたいですね、確かに、クラスBの宣言を外すと
    正常に動作しました。
    ただ、いまいちイメージがわきません。
    私がはじめにクラスA、クラスBで配列・変数を定義したのは、ヘッダーファイルで宣言した
    配列・変数を使うためにそれぞれで定義する必要があると思ったのですが、そうではない
    ようですね。

    ヘッダーファイルでexternで宣言した配列・変数を、そのヘッダーファイルをインクルードした
    どれかのソースファイルで定義すると、その定義した配列・変数が、ヘッダーファイルをインクルード
    しているすべてのソースファイルに活きてくるということなんでしょうね。。
    何か不思議な感じがします。

    myoko2様、Atsushi様、大変勉強になるご意見を頂きまして、ありがとうございました。

    鏑木
    2009年9月15日 9:47
  • 変数の定義と宣言の意味やスコープ、記憶クラス、リンケージといったあたりの理解が不十分なのだと思います。
    CやC++の入門書でしっかり理解したほうがいいと思います。
    • 回答の候補に設定 渋木宏明 2009年9月15日 17:03
    2009年9月15日 12:08
  • myoko2様、ご回答ありがとうございます。

    おっしゃっていただいたように、配列にいきなりアクセスして使用したいと思います。
    アドバイスありがとうございます。

    鏑木
    2009年9月16日 0:04
  • Atsushi777様、ご回答ありがとうございます。

    >変数の定義と宣言の意味やスコープ、記憶クラス、リンケージといったあたりの理解が不十分なのだと思います。
    >CやC++の入門書でしっかり理解したほうがいいと思います。
    おっしゃっていただいたようにまだまだ基礎が固まっていないようです。時間をみつけて再度勉強し直したいと思います。
    ご回答ありがとうございました。

    鏑木
    2009年9月16日 0:06