none
グローバル構造体やクラスの作成方法を教えて欲しいです。 RRS feed

  • 質問

  • VCの初心者です。

    今簡単なシリアル通信のアプリを作ろうとしています。今考えているのは、シリアル通信機能を持つグローバルのクラスを作って、そしてFormからそのクラスをアクセスして通信します。 そしたら、Form1でも、Form2でも、いくつのFormがあっても、同じクラスで通信できると思っています。 

    まず、この考え方でいけるかを知りたいです。 VBでしたら、できると分かっているけど、VCでは分かりません。

    もしできるなら、どうやってグローバルクラスを作るのかを教えて欲しいです。

    よろしくお願いいたします。


    cyo

    2012年6月13日 6:47

回答

  • 通信クラスをシングルトンにする必要性があるかどうかは別として、abstract sealedにすればそれらしくなります。

    public ref class Foo abstract sealed 
    {
    public :
        static void Bar()
        {
            Console::WriteLine(L"Foo::Bar()");
        }
    };
    

    このように定義して、以下のように呼び出します。

    Foo::Bar(); 

    abstract sealedにするとインスタンスメンバーを持つ事ができませんから、staticなクラスのような(VBのModuleのような)振る舞いとなります。

    しかし、このような設計にするのが適切かどうかはよく検討すべきだと思います。

    • 回答としてマーク AK46.5 2012年6月13日 16:53
    2012年6月13日 8:42

すべての返信

  • グローバルクラスってなんでしょう。

    C++/CLIにしろVBにしろクラスベースのオブジェクト指向言語ですから、設計の考え方は何も変わらないはずです。
    VBで実現できるのであれば、それ概念をそのままC++/CLIの文法に落とし込めばよいと思います。

    #もしやstatic(シングルトン)なクラスを作りたいという事なのでしょうか。

     

    2012年6月13日 7:08
  • 確かに、言うとおりですね。 でも、VC++/CLIを使う経験があまりないです。どこで、どういう風にしたらいいのか分かりません。

    VBの場合、モジュールを作って、その中でSerialPotを作ったら、アプリのどのフォームでもアクセスできます。 VC++/CLIのアプリの構造はちょっと複雑なので、この前テストで作ったアプリの中で、グローバルの構造体だと思ってたら、Form1の中でアクセスできたが、Form2の中でその構造体をアクセスコードを書くと、コンパイルエラーになり、宣言されていない変数をアクセスしようと。どうしたらいいかは分からないので、つくり方を教えて欲しいです。


    cyo

    2012年6月13日 7:48
  • 通信クラスをシングルトンにする必要性があるかどうかは別として、abstract sealedにすればそれらしくなります。

    public ref class Foo abstract sealed 
    {
    public :
        static void Bar()
        {
            Console::WriteLine(L"Foo::Bar()");
        }
    };
    

    このように定義して、以下のように呼び出します。

    Foo::Bar(); 

    abstract sealedにするとインスタンスメンバーを持つ事ができませんから、staticなクラスのような(VBのModuleのような)振る舞いとなります。

    しかし、このような設計にするのが適切かどうかはよく検討すべきだと思います。

    • 回答としてマーク AK46.5 2012年6月13日 16:53
    2012年6月13日 8:42
  •  クラスとインスタンスの区別ができていないのではないか、と思いました。

     クラスの公開範囲を public にしている限り、どこからでもクラスを使う事ができます。
     「グローバル クラス」というのが何を指しているのかよく分かりませんが、『そしてFormからそのクラスをアクセスして通信します。 そしたら、Form1でも、Form2でも、いくつのFormがあっても、同じクラスで通信できると思っています。』という記述に注目すると、「公開範囲を public にすればグローバル クラスです」が返答かと思います。


     ところで、フォーラムでの公開名ですが、使用条件で「行わない」と定められている『不適切、低俗、有害、中傷的、侵害的、わいせつ、下品または違法なトピック、名前、マテリアル、または情報を公表、投稿、アップロード、頒布、伝播すること。』に該当するのではないでしょうか。ご確認ください。


     また、中国台湾韓国のフォーラムもありますので、それらのご利用も検討してみてください。


    Jitta@わんくま同盟

    2012年6月13日 14:13
  • ご回答ありがとう、、、VCの知識が足りないのが問題です。

    公開名はなんでこうなっていたのが記憶にはなかったけど、入力の間違いかも知れません。調べると、自分もびっくり!公開名を変えます。ありがとう。


    cyo

    2012年6月13日 16:04