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

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

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

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

Q&A

解決済

3回答

8122閲覧

staticとstructを一緒に使うとうまくいきません

seri

総合スコア422

C#

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

0グッド

0クリップ

投稿2016/12/23 18:32

ゲームデータのセーブ用スクリプトを実装したいと思い。保持したい変数をstructな変数にまとめ各セーブデータから読み込めるような形の実装をしたいと思いまして、以下のようなスクリプトを組みました。

C#

1class save(){ 2public struct S{ 3int life; 4float mp; 5} 6} 7 8 9public static class savemanager(){ 10static save[5]; 11void set(save s){ 12s.life=10; 13s.mp=100; 14} 15}

しかし、この形ではエラーが出ます、エラーの対処法を色々調べたのですが
そもそも根本的な実装の仕方が違うのではと思い質問させていただきました

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

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

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

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

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

guest

回答3

0

こんにちは。

C#は進歩が早いので私がついて行っていないだけかもしれませんが、下記構文はないのでは?

C#

1class save() 2{ 3 クラス定義 4}

私の知る限り()が余分と思います。

public static class savemanager(){

()が余分と思います。

static save[5];

は変数名がないですよ。

void set(save s){

s.life=10;
s.mp=100;
}

saveクラスにlifeやmpは定義していないように見えます。
これらを定義しているのはS構造体では?

投稿2016/12/24 09:56

Chironian

総合スコア23272

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

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

Panzer_vor

2016/12/24 15:45

> Chironianさん 空で書き直してる時に見落としてましたが、 確かにクラス名横にカッコがついているのも文法的に誤りですね・・・^^; 当方の回答にもフィードバックさせていただきます。
guest

0

ベストアンサー

C# はやっていないので詳しいことはわかりませんが、

構造体は、

class内じゃなく、classのように書くのでは?

構造体オブジェクトを生成する場合は、

構造体名 オブジェクト名;

とするはずです。

なので、

C#

1struct save{ 2 int life; 3 int mp; 4}

とあったら、

save s[10];

のようにします。

staticをつけてもいい。

つまり構文間違い。

また、他の方もおっしゃっているように、

名前の付け方の決まり ( 命名規則っていいます。 ) があります。

基本的に構造体はすべて大文字。

struct save{

ではなく

struct SAVE{

です。

クラス名は 大文字から初めて、後は基本的に小文字。
二語以上でなる名前なら、それぞれの頭の文字は大文字、それ以外は小文字。
...

という風に。

投稿2016/12/26 10:02

BeatStar

総合スコア4958

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

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

0

先ず1つ目はコーディングのお作法的なお話になります。
変数名と区別する意味でもクラス名は単語単位で大文字を使う方が良いです。
それとインデントをつけるようにするとソースのメリハリがつき可読性が上がるので、
これも普段から行うように心がけると良いでしょう。
(整形機能のあるソースエディタだと勝手にやってくれたりしますが。)

次に2つ目ですがsaveクラスにスコープ指定してませんがこれは意図的にそうしているのでしょうか?
入れ子していないクラスの場合は省略するとスコープはinternalとなります。
これは同一プロジェクトないのモジュールに対しては公開、
別プロジェクトからは非公開という公開範囲となります。
アクセス修飾子はいい加減に覚えても良いことはないので、
もしあまり意識していない場合は、
意識するようにしていきましょう。

ここからが本題ですが、
savemanagerクラスのstaticメンバ変数の書き方がおかしいです。

static save[5];
これだとクラスを配列にしてるように見受けられるけど、
実は変数名も指定されておらず宣言としては完全に誤りです。
更に言うとsaveクラスに入れ子となる形で構造体を宣言しているため、
他のクラスから構造体を利用する際は、save.Sという感じで型を宣言しなくてはなりません。
あえて入れ子としているというよであれば良いですが、
そうでないなら構造体単体で宣言した方がシンプルかもしれません。

これらを踏まえて以下にサンプルを記載します。
空で書いてるのでミスしてるかもですが・・・

C#

1// 入れ子が不要なら構造体を単独で定義 2// class Save(){ 3public struct Save{ 4 // インデントをつけると見やすいかと 5 int life; 6 float mp; 7} 8//} 9 10// クラス名は単語単位で大文字に 11// public static class SaveManager(){ 12public static class SaveManager{ 13 //static save[5]; 14 static Save[] saves = new Save[5]; 15 // 蛇足だけど配列よりはListの方が使い勝手は良い。 16 // 最初のusingでSystem.Collections.Genericを参照してると使える 17 // static List<Save> saves = new List<Save>(); 18 19// C#では慣習的にはメソッド・プロパティ名は大文字始まり 20 void Set(Save s){ 21 s.life=10; 22 s.mp=100; 23 24 // 引数に値を設定してるけどこれを配列に保存したい??その場合は以下が処理が必要 25 // 要素番号指定がいる場合 26 // saves[0] = s; 27 28 // そもそも要素番号が大事でなければListでは以下のように書ける 29 // ただし下のように書くとのメソッドを呼ぶたびに要素数が増え、List末尾に新しく保存されます 30 // saves.Add(s); 31 } 32}

#追記
Chironianさんのご指摘にある通り、
クラス定義時にはクラス名横の()は不要でした。

当方の回答も誤ったままなので、
ソース訂正をさせていただきます。

ちなみにアスセス修飾子 クラス名(){}の書き方は、
クラスのコンストラクタで使用します。
(※カッコ内には必要であれば引数を指定できます。)

投稿2016/12/23 20:22

編集2016/12/24 15:52
Panzer_vor

総合スコア1636

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問