ゲームデータのセーブ用スクリプトを実装したいと思い。保持したい変数を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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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
総合スコア23272
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
総合スコア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総合スコア1636
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/12/24 15:45