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

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

ただいまの
回答率

88.90%

クラスの宣言について

解決済

回答 5

投稿

  • 評価
  • クリップ 0
  • VIEW 1,110

dekky0910

score 69

前提・実現したいこと

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

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

よろしくお願いします。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

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

試したこと

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

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

VS2015EX

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • t_obara

    2017/03/03 12:02

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

    キャンセル

回答 5

+3

C#の一般的な用語に沿えば
Hoge AAA これがHoge型の変数AAA宣言
new Hoge()これがHogeクラスのインスタンスの生成(インスタンス化)
Hoge AAA = new Hoge();
これはインスタンスを新しく作って、
変数を用意して、
作ったインスタンスを変数に代入しています。


クラスってものすごく大雑把に言えば型です。stringみたいな。
つまりあなたの疑問は
「Form1で宣言した文字列とForm2で宣言した文字列が同じにならない!!」みたいな疑問です。
当たり前ですね。型が同じなだけで違うデータなんですから。

Form1が持っているデータをForm2でも使いたかったら、
Form1がそれをForm2に渡してやらないといけませんね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/03 13:14

    回答ありがとうございます。

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

    キャンセル

+2

独自の用語をあいまいに使わず、一般的に通じる用語を使いましょう。

// クラス宣言
class Foo
{
    public void Bar()
    {
    }
}

// 変数宣言
Foo foo;

// インスタンス化(オブジェクトの生成)
new Foo();

// 変数の初期化
Foo foo = new Foo();

質問をこのように読みました。
以下のソースで、*1 の部分で Form1 をインスタンス化していますが、この時 Data も一緒にインスタンス化されます。Form1 のインスタンスは欲しいのですが、Data はインスタンス化してほしくありません。
どうしたら Data のインスタンスを作らず Form1 のインスタンスだけ作れるでしょうか?

class Data
{
}

class Form1
{
    public Data data = new Data();
}

class Form2
{
    // *1
    public Form1 form1 = new Form1();
}

質問がこれであっているなら、回答は次のようになります。
Form1 内で Data のインスタンスを作らず、宣言だけしてください。

class Data
{
}

class Form1
{
    public Data data;
}

class Form2
{
    // *1
    public Form1 form1 = new Form1();

    public Form2()
    {
        form1.data = new Data();
    }
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/03 13:12

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

    キャンセル

  • 2017/03/03 13:39

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

    キャンセル

+2

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

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

は 2 つに分けて、

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/03 13:26

    回答ありがとうございます。
    自分の中の解釈では宣言することによってそのクラスの参照ができ、改変を加えることが可能という解釈でした。
    そして、newすることによってそのクラスのコンストラクタを実行させ初期化させるものと思っています。

    今回は1度改変したクラスを改変を加えたクラスとは別のクラスで改変したいのですが、それがうまくいかず困っていました。

    キャンセル

  • 2017/03/03 13:42 編集

    上の回答の例で、

    クラス名 変数名;

    を変数名の宣言と言いますが、その段階ではメモリに確保されるのは変数名の入れ物だけれで、中身は null なので、「クラスの参照ができ、改変を加えることが可能」にはなりません。

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

    の段階で「クラス名」のインスタンスがメモリ上に生成され、そのアドレス(正確には違いますが)が「変数名」に代入されます。この段階まで来て初めて「クラスの参照ができ、改変を加えることが可能」になります。

    そのあたりの理解はできているでしょうか?

    > 1度改変したクラスを改変を加えたクラスとは別のクラスで改変したい

    すみませんがその説明だけでは具体的なイメージがわきませんので何とも答えようがないです。

    キャンセル

  • 2017/03/03 14:05

    勉強不足な上、説明不足で本当に申し訳ありません。

    前文の内容は理解は出来てると思っているのですが、完璧ではございません。

    最後の文章なのですが
    AクラスBクラスCクラスがあり、

    BクラスでAクラスをnewし、Aクラス内の変数に値を入れる

    CクラスでAクラス内の変数に値を入れる。
    この処理がしたかったのですが、参照型の代入で解決いたしました。

    キャンセル

checkベストアンサー

+1

こんにちは。

まず、Class AAA = new Class();というのはおまじないではないです。
newは文字通り「新しいxxxを作成する」という宣言です。newを書く度に、Classのクラス定義を元にした新しいオブジェクトが生成されるわけです。
つまり、質問文にある「そのFormをForm2で宣言」というのは、「新しいFormを(Form2内で)作成している」ということなので、変数は初期化されているわけではなく、最初のFormとForm2内のFormは別の実体なので、変数なども完全に独立しているだけです。

Form2からFormを参照したい場合は、元のFormそのものをForm2に与えるようにして下さい。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/03 13:08

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

    キャンセル

  • 2017/03/03 13:25

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

    キャンセル

  • 2017/03/03 13:28

    なるほど、=のあとはもともと用意しておいたformの場所を当てればいいのですね。

    わざわざありがとうございます。

    キャンセル

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 13:22

    回答ありがとうございます。

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

    キャンセル

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

  • ただいまの回答率 88.90%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る