none
(マネージ)クラスのプロトタイプ宣言の仕方

    質問

  • 以下のようにプログラムを組むと仮定します。

    何故、ヘッダーファイルで分けるんだ!とかは一先ず置いておくとして。

    hoge.cppでインクルードしているので、プログラム的にはマネージBからしたら、マネージAは見えていることになります。

    しかし、マネージAからは、マネージBが見えないのでプロトタイプ宣言してあげる必要があると思います。

    以下のように書くとコンパイルが通りません。どうしてでしょうか?

    ====hoge.cpp====

    #include "マネージ1.h"

    #include "マネージ2.h"

    ・・・・・

    =============

    -----マネージ1.h-----

    ref class マネージB;                           // プロトタイプ宣言

    ref class マネージA{

    マネージB^ b = gcnew マネージB();     // C2027

    ・・・

    };

    ----------------------

    ===マネージ2.h===

    ref class マネージB{

    マネージA^ a = gcnew マネージA();

    ・・・

    };

    =============

    2018年1月17日 13:07

すべての返信

  • マネージ、つまりC++/CLIにこだわられていますが、通常のC++であってもこのような記述は認められていません。宣言と定義について理解を深めることをお勧めします。

    ref class マネージB; とは「マネージB」という名前のref classが存在することを宣言しただけであり、その中身については後で定義することを示唆するものです。その後、 gcnew マネージB と記述されていますが、この段階でマネージBは中身が定義されておらず、当然ながらどのようなコンストラクターが存在するかも定義されていません。そのため、当該行は不正です。

    というわけでヘッダーファイルを分けたことが原因ではなく、2つのクラスが相互依存しているため、ヘッダーだけでは記述できない構造になっています。クラス定義内ではメンバー宣言だけを行い、後からメンバーの定義を行う必要があります。

    2018年1月17日 13:30
  • C++/CLI は C++ と .NET の両方の知識・経験を必要とし、かつ文献が少ない難しい世界です。
    現状の質問内容は、厳しい言い方になりますが、C++ の基本を理解できていないという状態に当たります。

    この状態から C++/CLI で成果物を作り上げるのはかなりの苦難が予想されます。
    今からでも C# で作れないかといったアプローチの再検討も提案しておきたいです。
    どうしても、C++/CLI を必要とするのであれば、その範囲を最小にできないか、そして、C++ 経験者を当てられないかといったことを考えたくなる場面です。

    ビジネスではなく、趣味だというのであれば、まずは C++ の普通のクラスでやり方を学んでください。

    2018年1月17日 13:37
    モデレータ
  • 回答ありがとうございます。そうなんですね、C++でも許されないんですか。

    Javaでは出来たような記憶があるんですけど、思い違いでしたでしょうか?

    C言語から勉強しなおします。

    ありがとうございます。

    2018年1月17日 14:03
  • そうなんですね、C++でも許されないんですか。Javaでは出来たような記憶があるんですけど、思い違いでしたでしょうか?

    おっしゃっていることがよくわかりません。JavaとC++はそれぞれ独立した言語です。Javaで出来ることはC++言語には何ら関係がありません。もしJava言語で記述したいのであればC++言語ではなくJavaを選択されることをお勧めします。

    また別スレッドですが、質問に対し回答を受けた後で質問を削除するようなことはやめてください。ここはあなたの個人ブログではなく公開フォーラムであり、多数の閲覧者・回答者がいることを理解してください。

    2018年1月17日 22:45