###前提・実現したいこと
お世話になります。
質問なのですが
クラスを呼び出す際
Class AAA = new Class();
といったように宣言すると思うのですが、
newを使わずにクラスの宣言は可能なのでしょうか?
今回疑問に思ったのがデータクラスをFormで宣言し、そのFormをForm2で宣言した際に
変数が初期化されてしまっていたのでもしそれを回避する方法があればご教授いただきたいです。
よろしくお願いします。
###発生している問題・エラーメッセージ
エラーメッセージ
###該当のソースコード
ここにご自身が実行したソースコードを書いてください
###試したこと
課題に対してアプローチしたことを記載してください
###補足情報(言語/FW/ツール等のバージョンなど
VS2015EX
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
C#の一般的な用語に沿えば
Hoge AAA
これがHoge
型の変数AAA
の宣言
new Hoge()
これがHogeクラスのインスタンスの生成(インスタンス化)
Hoge AAA = new Hoge();
これはインスタンスを新しく作って、
変数を用意して、
作ったインスタンスを変数に代入しています。
クラスってものすごく大雑把に言えば型です。stringみたいな。
つまりあなたの疑問は
「Form1で宣言した文字列とForm2で宣言した文字列が同じにならない!!」みたいな疑問です。
当たり前ですね。型が同じなだけで違うデータなんですから。
Form1が持っているデータをForm2でも使いたかったら、
Form1がそれをForm2に渡してやらないといけませんね。
投稿2017/03/03 03:25
総合スコア13521
0
質問者さんの言われる「宣言」というのは何を意味しているのでしょう?
クラス名 変数名 = new クラス名();
は 2 つに分けて、
クラス名 変数名;
変数名 = new クラス名();
とすることができ、前者が変数名の宣言、後者が初期化になりますが、その理解でよければ、
newを使わずにクラスの宣言は可能なのでしょうか?
は「可能です」という答えになります。
でも、たぶん、質問者さんの考えていることは違いますよね? であれば、「今回疑問に思った」というあたりの問題点をもう少し詳しく書いていただけませんか。
投稿2017/03/03 03:37
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/03/03 04:26
退会済みユーザー
2017/03/03 04:55 編集
2017/03/03 05:05
0
独自の用語をあいまいに使わず、一般的に通じる用語を使いましょう。
C#
1// クラス宣言 2class Foo 3{ 4 public void Bar() 5 { 6 } 7} 8 9// 変数宣言 10Foo foo; 11 12// インスタンス化(オブジェクトの生成) 13new Foo(); 14 15// 変数の初期化 16Foo foo = new Foo();
質問をこのように読みました。
以下のソースで、*1 の部分で Form1 をインスタンス化していますが、この時 Data も一緒にインスタンス化されます。Form1 のインスタンスは欲しいのですが、Data はインスタンス化してほしくありません。
どうしたら Data のインスタンスを作らず Form1 のインスタンスだけ作れるでしょうか?
C#
1class Data 2{ 3} 4 5class Form1 6{ 7 public Data data = new Data(); 8} 9 10class Form2 11{ 12 // *1 13 public Form1 form1 = new Form1(); 14}
質問がこれであっているなら、回答は次のようになります。
Form1 内で Data のインスタンスを作らず、宣言だけしてください。
C#
1class Data 2{ 3} 4 5class Form1 6{ 7 public Data data; 8} 9 10class Form2 11{ 12 // *1 13 public Form1 form1 = new Form1(); 14 15 public Form2() 16 { 17 form1.data = new Data(); 18 } 19}
投稿2017/03/03 03:22
編集2017/03/03 03:49総合スコア28660
0
ベストアンサー
こんにちは。
まず、Class AAA = new Class();
というのはおまじないではないです。
newは文字通り「新しいxxxを作成する」という宣言です。newを書く度に、Classのクラス定義を元にした新しいオブジェクトが生成されるわけです。
つまり、質問文にある「そのFormをForm2で宣言」というのは、「新しいFormを(Form2内で)作成している」ということなので、変数は初期化されているわけではなく、最初のFormとForm2内のFormは別の実体なので、変数なども完全に独立しているだけです。
Form2からFormを参照したい場合は、元のFormそのものをForm2に与えるようにして下さい。
投稿2017/03/03 03:03
総合スコア4103
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/03/03 04:08
2017/03/03 04:25
2017/03/03 04:28
0
オブジェクト指向の基本ですが、「クラス」と「インスタンス(オブジェクト)」はモノがまるで違います。
仮に「社員」というクラスがあり、インスタンスとして「鈴木」が作られることを考えますと
if(鈴木.役職 > '課長') { return 一般社員の支払い金額*3; } else { return 一般社員の支払い金額; }
これなら、鈴木さんの役職が確定しているので正しく動作出来ますが、仮にコレが「社員」であると、その社員の役職が確定しないので判別のしようがありません。
今回の質問では、使う場合によって初期化して欲しい値が違うという事ですが、これはコンストラクタをオーバーロードすれば可能な話かと思います。
Class 社員 { public 名前; public 役職; public function 社員(name) { this.名前=name; this.役職=ヒラ; } public function 社員(name, post) { this.名前=name; this.役職=post; } }
こうすると、
鈴木 = new 社員('鈴木'); //鈴木.役職 は 「ヒラ」 佐藤 = new 社員('佐藤', '部長'); //佐藤.役職 は 「部長」
と言う感じで、与える引数によって異なる初期化を行わせることが可能です。
投稿2017/03/03 03:28
総合スコア5405
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。