VC2005.NETで構造体を宣言する方法

このQ&Aのポイント
  • Visual Studio(VC++) .NET 2005マネージで構造体を作る方法を教えてください。
  • クラス内で構造体を宣言しようとするとエラーが出てしまいます。
  • 配列の宣言はうまくできるのですが、なぜ構造体がうまくいかないのでしょうか。
回答を見る
  • ベストアンサー

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); このように記述する事は分かりました。

noname#151586
noname#151586

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

structはマネージドではありません。 アンマネージドとマネージドを混在させて使おうとするといろいろと面倒です。

noname#151586
質問者

お礼

ありがとうございます。 キーワードを変えて調べてみました。 アンマネージド(unmanaged ネイティブとも) クラスは class 構造体はstruct マネージド(managed) クラスはref class 構造体は value class ということは、私の場合は定義を typedef value class{ BYTE a : 1 ; //ビットフィールド ~~ /* 構造体の中の配列は下記でよい? */ BYTE abc[10];//配列 /* 仮に駄目ならこちら */ array<BYTE>^ abc = gcnew array<BYTE>(10);//1 static array<BYTE>^ abc = gcnew array<BYTE>(10);//1 }STRUCTTEST; このようにする。 実態を作るときは下記のようにする。 static STRUCTTEST test = gcnew STRUCTTEST; 構造体配列なら下記のようにする。 static array<STRUCTTEST>^ test = gcnew array<STRUCTTEST>(10); ******************************* //typedefを使わない場合の記述はこう? value struct STRUCT TEST{ }; //上記の実体を作る static value struct STRUCTTEST test = gcnew STRUCTTEST; ******************************* このような感じでよいでしょうか?今手元に環境が無いため未確認です。

その他の回答 (1)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

STRUCTTESTの定義は? 「混合型」って出るってことは、アンマネージドの構造体ですか?

noname#151586
質問者

お礼

ありがとうございます。 typedef struct{ BYTE a : 1 ; //ビットフィールド ~~ BYTE abc[10];//配列 }STRUCTTEST; 今手元に環境が無いため記憶で書くとこんな感じです。 今書いて思ったのですがこのabcは array<BYTE>^ abc = gcnew array<BYTE>(10); このように書かなければならないということでしょうか。

関連するQ&A

  • VCのForm内で構造体を使いたい

    お世話になります VC初心者&苦手なので、初歩的な事を教えてください 構造体の配列をForm内の各関数で使用したいのですがうまく定義できません。 ソースの先頭で以下の宣言をしています(コンパイル通ります) #pragma endregion private: ref class AAADATA { public: int AAACnt; // AAAの数 int AAAPosX; // AAAのX座標 int AAAPosY; // AAAのY座標 int AAASize; // AAAのサイズ }; 以下が実際の宣言なのですが、MainForm_Loadでも上記宣言の直下に記載でも エラーとなってしまいます。 AaaData = gcnew array<AAADATA>^(10); やりたいことはAaaDataをForm内の各関数で使用したいだけなのですが。

  • VC++の構造体について。

    テキストファイルからのテキスト文を1行づつString^ dataに入れておいてストックしておくようなグローバル変数を作るために次のような構造体を作成しましたがエラーが出てしまいます。 このような構造体を作成して eeprom_data eeprom_data;と宣言して eeprom_data->line_test[0].data; などのようにデータにアクセスするようにしたいのですが、どのようにしたらできますでしょうか? typedef struct _line_test_ { String^ data; String^ adress; int length; }line_test; typedef struct _eeprom_data_ { array<line_test^>^ line_test = gcnew array<line_test^>(32); }eeprom_data; 現在のエラー内容はこのように表示されています。 1> HomeBank.cpp 1>c:\.....\10-03\homebank\homebank\Form1.h(763): error C2814: 'HomeBank::Form1::_line_test_' : ネイティブ型をマネージ型 'HomeBank::Form1' 中に入れ子にすることはできません 1> c:\.....\10-03\homebank\homebank\Form1.h(24) : 'HomeBank::Form1' の宣言を確認してください。 1>c:\.....\10-03\homebank\homebank\Form1.h(764): error C3265: マネージ 'data' をアンマネージ 'HomeBank::Form1::_line_test_' で宣言できません。 1> グローバル変数、静的変数、または gc ヒープのオブジェクトを参照しているネイティブ型のメンバーを宣言することはできません 1>c:\.....\10-03\homebank\homebank\Form1.h(765): error C3265: マネージ 'adress' をアンマネージ 'HomeBank::Form1::_line_test_' で宣言できません。 1> グローバル変数、静的変数、または gc ヒープのオブジェクトを参照しているネイティブ型のメンバーを宣言することはできません 1>c:\.....\10-03\homebank\homebank\Form1.h(772): error C2814: 'HomeBank::Form1::_eeprom_data_' : ネイティブ型をマネージ型 'HomeBank::Form1' 中に入れ子にすることはできません 1> c:\.....\10-03\homebank\homebank\Form1.h(24) : 'HomeBank::Form1' の宣言を確認してください。 1>c:\.....\10-03\homebank\homebank\Form1.h(773): error C3699: '^' : この間接指定を型 'HomeBank::Form1::line_test' で使用できません 1> コンパイラは、解析を続行するために '^' を '*' で置き換えます 1>c:\.....\10-03\homebank\homebank\Form1.h(773): error C3699: '^' : この間接指定を型 'HomeBank::Form1::line_test' で使用できません 1> コンパイラは、解析を続行するために '^' を '*' で置き換えます 1>c:\.....\10-03\homebank\homebank\Form1.h(773): error C3265: マネージ 'line_test' をアンマネージ 'HomeBank::Form1::_eeprom_data_' で宣言できません。 1> グローバル変数、静的変数、または gc ヒープのオブジェクトを参照しているネイティブ型のメンバーを宣言することはできません 1>c:\.....\10-03\homebank\homebank\Form1.h(773): error C2864: 'HomeBank::Form1::_eeprom_data_::line_test' : static const int データ メンバー以外をクラス内で初期化することはできません ========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ========== どうぞご教授頂きますよう、よろしくお願いします。

  • 構造体の中でユーザー定義型の型を使いたい TurboC → VC++2005

    昔、TurboCで作ったソースをVC++2005に置き換えようと難儀しています。 以下、構造体の中でユーザー定義型の型を使いたいのですが、 方法がわからず困っています。 ソースは途中で、コンパイルエラーになりませんが、肝心な所は コメントになっています。 詳しい方、教えていただけますか? /* 昔の古い構造体を VC++2005で使いたいです。 typedef struct _Test1{ char key[128]; char val[10]; } Test1; typedef struct _Test2{ char key[128]; Test1 val[10]; } Test2; */ #include <memory.h> using namespace System; using namespace System::Runtime::InteropServices; // テンプレート?でcharやshort型の配列はできるみたいです。 template<typename TYPE, size_t size> [StructLayout(LayoutKind::Sequential, Size=sizeof(TYPE) * size)] public value struct native_array{ TYPE elem; property TYPE default[int] { TYPE get(int index) { pin_ptr<TYPE> p = &this->elem; return p[index]; } void set(int index, TYPE value) { pin_ptr<TYPE> p = &this->elem; p[index] = value; } } }; public ref struct Test1{ String^ key; native_array<char, 10> val; Test1(){ key = "test1だよ"; pin_ptr<char> p = &this->val.elem; array<char>^ data = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; pin_ptr<char> dat = &data[0]; memcpy(p, dat, sizeof(this->val)); } }; public ref struct Test2{ String^ key; // charやshortなどでなく、ユーザー定義型のTest1の型を // 配列として10個確保したい // 記述方法がわかりません。 Test2(){ key = "test2だけど、test1の型を使いたいです。"; // 記述方法がわかりません。 } }; int main(array<String^>^ args){ Test1 test1; Test2 test2; // Test1 Console::WriteLine(test1.key); for (unsigned i = 0; i < sizeof(test1.val) / sizeof(test1.val[ 0 ]); ++i) { Console::WriteLine(test1.val[ i ].ToString()); } // Test2 Console::WriteLine(test2.key); // 記述方法がわかりません。 return 0; }

  • クラスや構造体のarrayを作りたい。

    クラスや構造体のarrayを作りたい。 クラスや構造体のarrayを作りたいのですが、 以下の方法で正しいのでしょうか? ==================================== #include <string> #include <vector> class Test{ public:   std::string sono1;   int sono2;   bool sono3;   //コンストラクタ   Test(std::string tmp_sono1,int tmp_sono2,bool tmp_sono3){     sono1=tmp_sono1;     sono2=tmp_sono2;     sono3=tmp_sono3;   } }; void main(){   std::vector<Test> testObjArray;   testObjArray.push_back(*(new Test("てすと1",1,true)));   testObjArray.push_back(*(new Test("てすと2",2,false))); } ==================================== 質問1: コンストラクタ時、クラス内の変数へ引数の値を渡す時、 上記のようにtmpを作成する以外の方法はありますか? 質問2: push_back時、クラスをインスタンスしてvectorに渡すにはこのような記述であってるのでしょうか? 「testObjArray.push_back(*(new Test("てすと1",1,true)));」 一応問題なく動いているようなのですが心配です。 よろしくお願いします。

  • ポインタ・ハンドル間のコピーと表示方法について VC++

    以下、サンプルですが、ポインタ・ハンドル間のコピーと 表示方法がわかりません。 VC++2005を使っている方、教えてください。 /* C++ ポインタとハンドル間のコピーと、表示させる方法が知りたいです。 */ using namespace System; namespace test { class Class1 { char msg[1024]; public: Class1(String^ _msg){ // _msgを msgにコピーする ポインターに // msgを表示 } }; ref class Class2 { static String ^msg = nullptr; public: Class2(char *_msg){ // _msgを msgにコピー ハンドル?に // msgを表示 } }; } //----------------------------------------------- // こんな書き方でよいのか? 古いC? // 引数は必要ないのでしょうか? //----------------------------------------------- int main(){ test::Class1* c1 = new test::Class1("test1"); delete c1; test::Class2^ c2 = gcnew test::Class2("test2"); return 0; }

  • クラスを配列で宣言してデバッグ中にエラーが出る。

    今、"Wireless_unit_str"というクラスをWireless_ID_str02 で宣言してこれを32個分宣言して Wireless_ID_str02[i]->Wireless_ID_str = "test"; 32個分のWireless_ID_str の中に全部”test” と代入してみようとしたのですが、デバッグ最中にその文を実行しようとすると、つぎのようなエラーが出ます。 (エラー内容) ”'System.NullReferenceException' のハンドルされていない例外が HomeBank.exe で発生しました。 追加情報: オブジェクト参照がオブジェクト インスタンスに設定されていません。” 解決する方法はないでしょうか? array<Wireless_unit_str^>^ Wireless_ID_str02 = gcnew array<Wireless_unit_str^>(32); for(i=0; i < 32;i++) { Wireless_ID_str02[i]->Wireless_ID_str = "test"; } 作成したクラス”Wireless_unit_str”の内容 namespace HomeBank { using namespace System; using namespace System::Collections::Generic; /** * 明細データクラス */ ref class Wireless_unit_str { private: DateTime date; // 日付 String^ name; // 品名 String^ kind; // 分類 int money; // 金額 public: String^ Wireless_ID_str; //array<String^>^ Wireless_ID_str = gcnew array<String^>(32); public: Wireless_unit_str() { Wireless_ID_str = "test"; } }; }

  • VC++2008で、新規フォームアプリのメインプロジェクトの内容について

    aという名前を付けて作ったら、a.ccpの内容は以下のようになっていました。 --------- // a.cpp : メイン プロジェクト ファイルです。 #include "stdafx.h" #include "Form1.h" using namespace a; [STAThreadAttribute] int main(array<System::String ^> ^args) { // コントロールが作成される前に、Windows XP ビジュアル効果を有効にします Application::EnableVisualStyles(); Application::SetCompatibleTextRenderingDefault(false); // メイン ウィンドウを作成して、実行します Application::Run(gcnew Form1()); return 0; } --------- この、 using namespace a; の行までと//つきのコメントの行は意味は分かるのですが、 それ以外の細かい意味がよく分かりません。 ・main関数の()内にマネージ配列がこのように入っていると、結果的にどういう動作になるのでしょうか?また、return 0でどうなりますか? ・Application::EnableVisualStyles(); は、「visual スタイル」を有効にするための表記だと聞きましたが、その「visual スタイル」というのはなんなのでしょうか? ・Application::SetCompatibleTextRenderingDefault(false); というのは、スタンドアロンの Windows フォーム アプリケーション用の表記なのですよね?テキスト描画方法?に関係してる、みたいなことを見た気がしますが、具体的にはtrueにするとどうなって、falseにするとどうなるのでしょうか? ・Application::Run(gcnew Form1()); の()内は、Form1.hで実装済みのFormクラスを継承して作られていたrefクラス「Form1」のインスタンスを『無名』で作り、それに対してApplication::Runメソッドを実行する、という意味なのでしょうか?

  • VC++2010で配列に文字列を使用する方法

    array<String^,3>^ myMat = gcnew array<String^,3>(15,97,3338); このようにするとビルド出来るのですが、 array<String^,3>^ myMat = gcnew array<String^,3>("あ","か","さ"); とすると 1>d:\documents and settings\****\my documents\visual studio 2010\projects\****\Form1.h(220): error C2440: '初期化中' : 'const char [3]' から 'int' に変換できません。 1> この変換が可能なコンテキストはありません。 とエラーが出てしまいます どのようにすれば良いのでしょうか?

  • VC++でラベルに表示できない[.NET]

    VC++でラベルに表示できない[.NET] 以下のプログラムですがエラーが出ます。 #include "stdafx.h" #include "Form1.h" using namespace CursorXY1; [STAThreadAttribute] int main(array<System::String ^> ^args) { static POINT Point; // コントロールが作成される前に、Windows XP ビジュアル効果を有効にします Application::EnableVisualStyles(); Application::SetCompatibleTextRenderingDefault(false); // メイン ウィンドウを作成して、実行します Application::Run(gcnew Form1()); label1->Text="これはラベルです"; return 0; } エラー内容: 1>.\Form1.cpp(27) : error C2065: 'label1' : 定義されていない識別子です。 1>.\Form1.cpp(27) : error C2227: '->Text' : 左側がクラス、構造体、共用体、ジェネリック型へのポインタではありません。 1> 型は ''unknown-type'' です。 ヘッダーファイルに「Form1.h,resource.h,stdafx.h」があります。 Designerでlabel1を設置しました。 Windowsフォームアプリケーションを選択しました。 初心者ゆえにずっとつまいずいていて、このたび質問させていただくことになりました。 よろしくお願いします。

  • テンプレートクラスでのクラス変数

    テンプレートから生成したクラスごとにクラス変数を設けて、 かつ、クラス変数の初期化をいちいちやらなくてもよい という状況を作りたいと考えています。 そこでたとえば template <int N> class test { public: static int class_var() { static int class_var_ = N; return class_var_; } }; としたとき test<1>::class_var() と test<2>::class_var() はどのような値になるのでしょうか? VC++ではテンプレート全体で class_var_の値が同じになってしまうようのなのですが。。。 そもそも、こういうクラス変数自体を つくろうという考えが間違っているのでしょうか? どなたかご存知でしたらお教えください。

専門家に質問してみよう