• ベストアンサー

C,C++,C++/CLIの構造体とクラス

C++の構造体・クラスって、メンバのアクセス指定子のデフォルトが privateかpublicかという違い「だけ」しか全くないのでしょうか? クラスにおける value class / ref class という分類はC++/CLIのもので これについては value class の方は C言語の構造体に近いという事でいいでしょうか? ref classの方は ネイティブのC++のクラスを マネージ用にしたようなもので C++/CLIの構造体は C++のそれと同じで OKですか? そしてそれらの構造体には、値型・参照型といった分類はないのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

> ということは、structも継承可、という事でしょうか? structでも継承可能です。 > 継承のアクセス指定の方は > クラスと構造体ではどうなるのでしょうか? class A : Base {}; は class A : private Base {}; と等価です。 一方、 struct A : Base {}; は struct A : public Base {}; と等価です。 > そして「集成体」というのが初めて知ったのですが > これはいわゆる、配列や・・・ある条件下でのクラス・・? > なのでしょうか? 配列と以下の条件をすべて満たすクラスのことです。 ・ユーザー定義のコンストラクタを持たない ・非公開または限定公開のメンバを持たない ・基底クラスを持たない ・仮想関数を持たない ちなみにC言語の集成体は、配列と構造体の総称です(共用体は集成体ではありません)。

LongSecret
質問者

お礼

なるほど♪ ありがとうございます。 え~っと、つまり… ・非公開または限定公開のメンバを持たない ↓ privateやprotectedを持たないつまり 全部public ・基底クラスを持たない ↓ 継承してない ・仮想関数を持たない ↓ virtualの文字が見当たらない という言い方も出来るということですか? そしてこの ・ユーザー定義のコンストラクタを持たない という部分は、どういう意味なのでしょうか…? コンストラクタって、書かなくてもできましたっけ…?? 「中身なし」って事でしょうか?

その他の回答 (2)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

> という言い方も出来るということですか? そうですが... > virtualの文字が見当たらない については、マクロで置換されている可能性もあるので、その部分だけを見て判断するのは危険です。 > ・ユーザー定義のコンストラクタを持たない > という部分は、どういう意味なのでしょうか…? > コンストラクタって、書かなくてもできましたっけ…?? クラスにコンストラクタをまったく定義しない場合、デフォルトコンストラクタとコピーコンストラクタが勝手に生成されます。

LongSecret
質問者

お礼

なるほど そういう意味では、確かにそうですね。 そして、コンストラクタについては 言われてみるとそういう文を見たことがあった気がしました。(いつも大抵いじってたので、すっかり忘れてました。) ありがとうございます。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

> C++の構造体・クラスって、メンバのアクセス指定子のデフォルトが > privateかpublicかという違い「だけ」しか全くないのでしょうか? C++では、構造体も共用体もクラスの一種です。 クラスキーがstructのものを「構造体」、unionのものを「共用体」と呼んでいるにすぎません。 クラスキーがclassのものとstructのもののでは、メンバのアクセス指定と継承のアクセス指定のデフォルトが異なります。 > value class の方は C言語の構造体に近いという事でいいでしょうか? どちらかといえば、C++の集成体に近いかも。 あとはメモリ管理の方法とか...。

LongSecret
質問者

お礼

ありがとうございます。 確認ですが value class の方は、アンマネージですよね? そして、 >クラスキーがstructのものを「構造体」、unionのものを「共用体」と呼んでいるにすぎません ということは、structも継承可、という事でしょうか? 継承のアクセス指定の方は クラスと構造体ではどうなるのでしょうか? そして「集成体」というのが初めて知ったのですが これはいわゆる、配列や・・・ある条件下でのクラス・・? なのでしょうか?

LongSecret
質問者

補足

「structも」→「ref structも」です。

関連するQ&A

  • [C++/CLI] アンマネージクラスの中でマネージクラスを使用したい。

    イベント駆動型のライブラリを使用しているプログラムのC++/CLIへの移行で困っています。 イベントの基底クラスAがC++の構文で書かれているため、派生クラスBはclassで宣言するようにコンパイラからエラーが帰りました。 ですので、classと宣言すると今度はアンマネージクラスの中でマネージコードは使用不可能といわれました。 どうにかこの現象を回避する方法はありませんか? class A : ライブラリで宣言されているイベントハンドラ(変更不可能) ref class B : A{} と宣言するとref classは使えないとエラー class B : A{} と宣言するとマネージコードが使用できないとエラー

  • C++/CLIでネイティブの構造体を使用したい

    すみません。C++の初心者です。 C++/CLIフォームアプリケーションで関数の呼出し画面を作成しています。 既にある(C++ネイティブで作成済み)のヘッダファイルをプロジェクト上にコピー、追加して ヘッダファイル内に書かれている構造体を使用したいのですが、 出来ないのでしょうか? ヘッダファイル(xxx.h)内には以下のような構造体が作成されています。 typedef struct { double pq_base; int iter_max; double eps; int chi_set_flg; int bad_rmv_flg; int obs_slk_flg; int obs_before_flg; int calc_pf_flg; double *chi_val_95_0; double *chi_val_97_5; double *chi_val_99_0; }s_SE_SET; C++/CLIのプロジェクト内にこのヘッダファイルを追加して フォーム内のあるボタンを押された時に、この構造体を参照させてあげたいのですが、 以下の様に構造体変数を定義して s_SE_SET se_set; ビルドを行うと以下のエラーが出ます。 error C4368: 'se_set' をマネージ 'se_project::Form1' のメンバーとして定義できません。 混合型はサポートされていません C++/CLIではネイティブで定義された構造体は使用出来ないのでしょうか? なにか方法が有るとすればその方法を教えて頂けると嬉しいです。 どなたかご教授頂けませんでしょうか。 よろしくお願い致します。

  • __gcクラスから、__nogcクラスの構造体を使おうとするとLNK2020エラーが出ます

    NET 2003 C++ のマネージとアンマネージに関する質問です。 「__gc class」から、「__nogc class」の中に作った、「__nogc struct」構造体を使用しようとすると、「error LNK2020: 未解決のトークン」といったエラーになってしまい、 ビルドができません。 構造体を持つクラスの指定を「__gc class」に指定すると、ビルドが通るようになります。 これはどういった理由なのでしょうか? マネージクラスから、アンマネージクラスの構造体は利用できないのでしょうか? 利用できるように改善する方法がございましたら、お教えいただけますと幸いです。 何卒よろしくお願いします。

  • マネージクラスについて

    マネージクラスで可変長の引数を使いたいのですが、 public ref class CTest { public: CTest(); // コンストラクタ ~CTest(); // デフォルトコンストラクタ !CTest(); // ファイナライザ Msg(PSTR str, ...); // 可変長引数 }; とすると、 「error C3269: マネージ クラスのメンバ関数は '...' と共に宣言することはできません」 というエラーがでてしまいます。 なんとかしてマネージクラスで 可変長の引数を使いたいのですが、方法がわかりません。分かる方いますでしょうか?

  • c++/cli variant型

    こんばんは。 c++/cliは初めていろいろ戸惑っているところなんですが、variant型というのは扱えるのでしょうか? COMですとVARIANT構造体とか、_variant_tがあったと思うのですが、c++/cliではどのクラスを使えばよろしいのでしょうか?

  • C++/CLIでクラス内の要素を相互利用する方法

    C++/CLIでクラスの中に定義された構造体等を、複数のクラス間で相互利用したいのですが、そのようなことは可能なのでしょうか。 とりあえず以下のコードを見ていただきたいのですが、 ref class class1; ref class class2; ref class class1 { public:  enum struct enum1  {   aa,bb  };  void func1a(class1^ obj){} // 1. OK  void func2a(class2^ obj){} // 2. OK  void func1b(class1::enum1 e){} // 3. OK  void func2b(class2::enum2 e){} // 4. ERROR }; ref class class2 { public:  enum struct enum2  {   aa,bb  };  void func1a(class1^ obj){} // 5. OK  void func2a(class2^ obj){} // 6. OK  void func1b(class1::enum1 e){} // 7. OK  void func2b(class2::enum2 e){} // 8. OK }; これの4.がコンパイルエラーになります。 このような構造を定義することはできないのでしょうか。

  • vc2005.net 構造体の宣言について

    visual studio(VC++) .net 2005マネージを練習しています。 クラス内に構造体を作りたいのですがうまくいきません。 public ref class Form1:~~ 上記クラス中で public: static STRUCTTEST test = gcnew STRUCTTEST; 上記のように記述したところ '^'この間接指定を型STRUCTTESTで使用出来ません。 と出ます。 マネージだから'^'で良いのではないでしょうか。 ^をとったところ testをマネージtestslusion::Form1のメンバとして定義できません。混合型はサポートされません。 と出ます。マネージでは^が必要なはずなのでこれは分かるのですが・・・。 gcnewをnewにしても^を*にしてもコンパイルエラーが出ます。 これは何故でしょうか。 ちなみに配列を static array<int>^ test = gcnew array<int>(10); このように記述する事は分かりました。

  • C++/CLIの構造体のコンストラクタについて

    C++/CLIの構造体のコンストラクタについて C++/CLIで、固定サイズの配列を持つ構造体を、次のようにコーディングして使っています。 value struct AAA { public:   array<unsigned short>^ m1;   AAA(unsigned short dummy)   {     m1 = gcnew array<unsigned short>(4);   } }; AAA ^struct0 = gcnew AAA(0); この方法で正常に動作するのですが、2点ほど気になる点があります。 (1) コンストラクタAAA(unsigned short dummy)を実装しなくても済む方法がないか? (2) この方法では、struct0を、ネイティブヒープ領域に割り当てられない (AAA *struct0 = new AAA(0))でコンパイルエラー) (1)と(2)は関連する気もするのですが、これらを解決する方法はあるのでしょうか?

  • .NET C++/CLIのガーベジコレクションについて

    .NET C++/CLIのガーベジコレクションについて .NET C++/CLIで、マネージピープの配列をネイティブDLLにポインタ引数として渡す動作で、 配列が正常に渡っていることは確認したのですが、ネイティブDLL側で配列の処理をしている最中に、 ガーベジコレクションが起こり、誤動作することはあるのでしょうか。 ちなみに、マーシャリングは以下のように行いました。 // マネージ側コード [DllImport("native.dll")] void ArraySet( [MarshalAs(UnmanagedType::LPArray)] array <int> ^ Data ); array <int> ^ Data = gcnew array <int>(64); ArraySet( Data ); // この中で配列の処理中にガーベジコレクションが起こると誤動作?

  • C#とC++/CLI間でポインタが指す内容が変わる

    現在、C++/CLIプログラムをC#で使う必要があり、 C++/CLIで定義したメソッドとクラスでC#側とやり取りする必要が生じております。 以下の書き方で、C++/CLIとC#間のクラスのやり取りはできたのですが、 C++/CLI側で定義されているメソッド内で、ポインタが指し示す値(*id.head)が変わってしまいます(文字化けみたいな感じになる)。 引き渡したポインタ変数の値は一致しているのですが、 どうすれば、C++/CLI側で値を正しく取得できるのでしょうか?。 【C++/CLI側で定義されているクラス】 public value class class1 { public : ULONG code; header    *head; }; typedef struct _header { CHAR achCHdrType[2]; CHAR achMsgLen[2]; } header ; 【C++/CLI側で定義されているメソッド】 ULONG session::open(class1& id) { return session_oepn(id.code, *id.head) } 【C#側でのメソッド参照】 class1 c1 = new class1(); uint status = session.open(&c1); よろしくお願いします。