CLIで、データを別クラスにした場合の、変数の宣言

解決


アリオン  2008-07-26 16:44:34  No: 68789

.NET2008です。

CLIで、データを別クラスにした場合、

そのデータが配列のときは、

data.hファイルを追加して、

ref class Data {
  private: 
    String^ text;
  public: 
    void Settext(String^ value){ text = value; }
    String^ Gettext(void){ return text; }

というようにしておいて、

Form1.hで、

private:  
     array<Data^>^ val;

public:
//略
     val = gcnew array<Data^>( 10 );
     for ( int i=0; i<=9; i++ ) { 
          val[i] = gcnew Data(); 
    }
 
として、
あとは、val[i]->get***やval[i]->set***でデータの出し入れができました。

これは、配列の場合ですが、もし、配列ではなく、String型の変数ひとつの場合、Form1.hのコードはどうなるのでしょうか。

arrayは配列ですが、これを何に置き換えたらいいのか分かりません。

よろしくお願いします。


επιστημη  URL  2008-07-26 19:09:10  No: 68790

↓単に Data^ data; じゃなくて?

using namespace System;

ref class Data {
private: 
  String^ text;
public: 
  void Settext(String^ value){ text = value; }
  String^ Gettext(void){ return text; }
};

ref class Form1 {
private:
  Data^ data;
public:
  Form1() { data = gcnew Data(); }
  void set(String^ s) { data->Settext(s); }
  String^ get() { return data->Gettext(); }
};

int main() {
  Form1^ f = gcnew Form1();
  f->set(L"文字列");
  Console::WriteLine(f->get());
}


アリオン  2008-07-27 15:22:55  No: 68791

επιστημηさん、ありがとうございます。

Data^ data;
としたことで、できました。
data->Settext(s); で値をtextに入れて、s = data->Gettext(); で、
値を取り出すことができました。

ところが次に、マルチフォームにしようと、Form2を追加して、Form2で
値を取り出そうとしたところ、うまくいきません。
あちこちにブレークポイントを置いて確かめたところ、どうやら、Form1と、
Form2の両方で Data^ data を宣言しているので、text が別な変数になっているようなのです。

といって宣言しなければエラーになります。

Form2でdata.h(Dataクラスを置いたヘッダファイル)をインクルードして、Form1でForm2をインクルードしています。
それはそれでいいのでしょうか。

アドバイスをお願いいたします。


επιστημη  URL  2008-07-27 18:08:43  No: 68792

説明ヘタクソ。

> Form1と、Form2の両方で Data^ data を宣言しているので、
> text が別な変数になっているようなのです。

当然でしょう。なにがしたいのかが読み手に伝わりません。


アリオン  2008-07-27 18:53:03  No: 68793

すみません。

Form1でdata->Settext(s) した値を、Form2でdata->Gettext() したり、
その逆をやったりしたいのですが。。。

このやり方では無理なのでしょうか。


επιστημη  URL  2008-07-27 19:00:38  No: 68794

ヒント:

他人のサイフにコインいれて自分のサイフから出てくるわけがありません。
が、この二人の財布が同一のものなら可能です。


アリオン  2008-07-27 19:33:28  No: 68795

> 二人の財布が同一のものなら可能です。

それは考えたのですが、具体的なコードはわかりません。
手元の参考書にも、書いてないようです。

財布は、Form1.hのものとするのでしょうか。
それともform2.hのものとするのでしょうか。
あるいは、Dataクラスのものとするのでしょうか。


επιστημη  URL  2008-07-27 19:51:12  No: 68796

> 財布は、Form1.hのものとするのでしょうか。
> それともform2.hのものとするのでしょうか。

同一なのでどちいでもかまいませんね。

↓ざっくり書いてみた。鵜呑みにするべからず。
http://cid-07c558f8e11e708f.skydrive.live.com/self.aspx/WillBeRemovedSoon/SharedData.zip


アリオン  2008-07-30 16:24:16  No: 68797

επιστημηさん、ありがとうございます。

頂いたコードを、いままで、あれこれ研究していました。

まず、変数などをいろいろ入れ替えて、動きを確かめました。
次に、Form1とForm2で受け渡す変数を複数にしてみました。

ここまではうまくいったのですが、受け渡す変数を配列にするところで、躓きました。

MyDataクラスはそのままにして、Form1で、

MyData^ data_;

array<MyData^>^ data_;
に、

data_ = gcnew MyData(L"(初期値)");

data_ = gcnew array<MyData^>( 10 );
for ( int i=0; i<=9; i++ ) { 
  data_[i] = gcnew MyData(""); 
}
for ( int i=0; i<=9; i++ ) {
  child1 = gcnew Form2(data_[i]); 
}
に、置き換えてみました。

これで、Form2はそのままに、実行してみると、
配列の最後の要素、data_[9]に値が入ります。

ここまで正しいのかどうか、が、そもそも分からないのですが、
とりあえず値が取り出せるので、正しいとして、Form2をどう書き変えたら
いいのかわかりません。

単純に、変数を配列に置き換えるだけでは、エラーになります。
多くの場合は、
「引数を 'SharedData::MyData ^' から 'cli::array<Type> ^' に変換できません。」
というメッセージが出るので、配列の宣言がうまくいっていないと思うのですが、
どうしたらいいか分かりません。

これなら最初から配列で質問すればよかったので、心苦しいのですが、アドバイスを頂けませんでしょうか。


επιστημη  URL  2008-07-30 18:58:54  No: 68798

めんどくせー...

child1 = gcnew Form2(data_[i]); 
配列渡してないんだからコケるのアタリマエ。


アリオン  2008-07-30 19:59:30  No: 68799

ありがとうございます。

Form1.hでは、すでに
for ( int i=0; i<=9; i++ ) {
    child1 = gcnew Form2(data_[i]); 
}
があるので、Form2.hの話と思いました。

Form2.hで、Form1.hに準じて
private:
    Form2^ child1;
    array<MyData^>^ data_;

    public:
        Form2(array<MyData^>^ data)
        {
            InitializeComponent();
            //
            //TODO: ここにコンストラクタ コードを追加します
            //
            data_ = gcnew array<MyData^>( 10 );
            for ( int i=0; i<=9; i++ ) { 
                data_[i] = gcnew MyData(""); 
            }
            for ( int i=0; i<=9; i++ ) {
                child1 = gcnew Form2(data_[i]); 
            }
        }
とした場合、
「引数を 'SharedData::MyData ^' から 'cli::array<Type> ^' に変換できません。」
というメッセージが3個出ます。
まだ、各変数や、ポインタ?の関係がよくわかりません。

アドバイスを頂けませんでしょうか。


επιστημη  URL  2008-07-30 20:19:03  No: 68800

>「引数を 'SharedData::MyData ^' から 'cli::array<Type> ^' に変換できません。」
> というメッセージが3個出ます。

当然です。

> アドバイスを頂けませんでしょうか。

勉強しましょう。

http://cid-07c558f8e11e708f.skydrive.live.com/self.aspx/WillBeRemovedSoon/SharedData.zip


επιστημη  URL  2008-07-30 20:20:15  No: 68801

おっとマチガイ。

http://cid-07c558f8e11e708f.skydrive.live.com/self.aspx/WillBeRemovedSoon/SharedData2.zip


アリオン  2008-08-02 15:20:09  No: 68802

επιστημηさん、ありがとうございます。

2度目に頂いたコードを、研究しました。

「理解したのか」と言われると、答えに窮するのですが、思いつく限りでテストしてみました。

引き続き、勉強します。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加