質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

5回答

1654閲覧

クラスの宣言について

dekky0910

総合スコア93

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2017/03/03 02:53

###前提・実現したいこと
お世話になります。
質問なのですが
クラスを呼び出す際
Class AAA = new Class();
といったように宣言すると思うのですが、
newを使わずにクラスの宣言は可能なのでしょうか?

今回疑問に思ったのがデータクラスをFormで宣言し、そのFormをForm2で宣言した際に
変数が初期化されてしまっていたのでもしそれを回避する方法があればご教授いただきたいです。

よろしくお願いします。
###発生している問題・エラーメッセージ

エラーメッセージ

###該当のソースコード

ここにご自身が実行したソースコードを書いてください

###試したこと
課題に対してアプローチしたことを記載してください

###補足情報(言語/FW/ツール等のバージョンなど
VS2015EX

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t_obara

2017/03/03 03:02

「データクラスをFormで宣言し、そのFormをForm2で宣言した際に 変数が初期化されてしまっていた」の意味がわかりません。さらに、この内容と、newを使わずに初期化をすることの関連性はなんだとお考えなのでしょうか。
guest

回答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

ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dekky0910

2017/03/03 04:14

回答ありがとうございます。 もともとの解釈が間違っていました。 newするとそのクラスにアクセスできるようになる。 それだけだと思っていたのが今回の原因でした。
guest

0

質問者さんの言われる「宣言」というのは何を意味しているのでしょう?

クラス名 変数名 = new クラス名();

は 2 つに分けて、

クラス名 変数名;
変数名 = new クラス名();

とすることができ、前者が変数名の宣言、後者が初期化になりますが、その理解でよければ、

newを使わずにクラスの宣言は可能なのでしょうか?

は「可能です」という答えになります。

でも、たぶん、質問者さんの考えていることは違いますよね? であれば、「今回疑問に思った」というあたりの問題点をもう少し詳しく書いていただけませんか。

投稿2017/03/03 03:37

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dekky0910

2017/03/03 04:26

回答ありがとうございます。 自分の中の解釈では宣言することによってそのクラスの参照ができ、改変を加えることが可能という解釈でした。 そして、newすることによってそのクラスのコンストラクタを実行させ初期化させるものと思っています。 今回は1度改変したクラスを改変を加えたクラスとは別のクラスで改変したいのですが、それがうまくいかず困っていました。
退会済みユーザー

退会済みユーザー

2017/03/03 04:55 編集

上の回答の例で、 クラス名 変数名; を変数名の宣言と言いますが、その段階ではメモリに確保されるのは変数名の入れ物だけれで、中身は null なので、「クラスの参照ができ、改変を加えることが可能」にはなりません。 変数名 = new クラス名(); の段階で「クラス名」のインスタンスがメモリ上に生成され、そのアドレス(正確には違いますが)が「変数名」に代入されます。この段階まで来て初めて「クラスの参照ができ、改変を加えることが可能」になります。 そのあたりの理解はできているでしょうか? > 1度改変したクラスを改変を加えたクラスとは別のクラスで改変したい すみませんがその説明だけでは具体的なイメージがわきませんので何とも答えようがないです。
dekky0910

2017/03/03 05:05

勉強不足な上、説明不足で本当に申し訳ありません。 前文の内容は理解は出来てると思っているのですが、完璧ではございません。 最後の文章なのですが AクラスBクラスCクラスがあり、 BクラスでAクラスをnewし、Aクラス内の変数に値を入れる CクラスでAクラス内の変数に値を入れる。 この処理がしたかったのですが、参照型の代入で解決いたしました。
guest

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
Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dekky0910

2017/03/03 04:12

細かく回答ありがとうございます。 まさに質問したい内容そのままです。 たとえばなのですが、Form1の中でクラスの中の変数を扱った後にForm2を呼び出し form1.data = new Data();を行うとクラスの変数は変更後の値で取得できるということでしょうか?
dekky0910

2017/03/03 04:39

すみません、別の回答者様の答えで解決いたしました。 ありがとうございます。
guest

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

tamoto

総合スコア4103

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dekky0910

2017/03/03 04:08

回答ありがとうございます。 なるほど。新しく作成されるのですね。 FormそのものをForm2に与えると書いてありますがそれはそれようの命令文などはあるのでしょうか?
tamoto

2017/03/03 04:25

命令文というか、[new Form()] はFormのオブジェクトを生成したもので、それを[Form form1 = ]で、変数form1の中に入れているわけですから、[new Form()]の代わりに、すでに生成してあるformをform1に代入すればいいのです。 [Form form1 = どこかにあるform;] どこかにあるformの参照を引っ張ってきてform1に渡す実際のやり方は、完全に別の質問になるためここでは省略します。設計によって幾つかのやり方があります。
dekky0910

2017/03/03 04:28

なるほど、=のあとはもともと用意しておいたformの場所を当てればいいのですね。 わざわざありがとうございます。
guest

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

kunai

総合スコア5405

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dekky0910

2017/03/03 04:22

回答ありがとうございます。 初歩的な質問で申し訳ないのですが、社員クラスから鈴木や佐藤といったインスタンスを生成するのだと思うのですが、 会社クラスというものがあり そこには部署インスタンスを用意しておき 回答者様の作った社員クラス、この社員クラスでは部署クラスのインスタンスを生成しておき 最上層に給与クラスを作った場合、 給与クラスのメソッドから部署インスタンス内の変数を変更したい場合どのようにしたらよいのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問