2010-11-06 59 views
0

當我編譯編譯器下面的代碼得到錯誤:字段初始不能引用非靜態字段,方法或特性在此代碼(有星星)編譯錯誤:一個字段初始不能引用非靜態字段,方法或屬性

KingPiece kingPiece = new KingPiece(***siyahsah1***,ChessColor.White); 

任何人都可以幫我嗎?

class PiecePosition 
{ 

    public enum ChessColor 
    { 
     White, 
     Black, 
    } 
    public class ChessPiece 
    { 

     private Image DisplayedImage; 
     private ChessColor DisplayedColor; 
     private Point CurrentSquare; 
     public Point[] ValidMoves; 
     public ChessPiece(Image image, ChessColor color) 
     { 
      DisplayedImage = image; 
      DisplayedColor = color; 
     } 
    } 

    public class KingPiece : ChessPiece 
    { 



     public KingPiece(Image image, ChessColor color) 
      : base(image, color) 
     { 


      ValidMoves[0] = new Point(0, -1); // Up 1 
      ValidMoves[1] = new Point(1, -1); // Up 1, Right 1 
      ValidMoves[2] = new Point(1, 0);  // Right 1 

      ValidMoves[7] = new Point(-1, -1); // Left 1, Up 1 
     } 

     System.Drawing.Bitmap siyahsah1 = chess6.Properties.Resources.siyahsah1; 
     KingPiece kingPiece = new KingPiece(siyahsah1,ChessColor.White); 


    } 

} 
+0

請不要張貼unrelevant代碼,它使閱讀難,CLAS局在你的例子是無關你的問題。除了使Board類嵌套到PiecePosition有點奇怪 – 2010-11-06 16:49:20

回答

1

正如其他人所說,siyahsah1是一個非靜態的私人領域,不能用於初始化等領域。 但你在這裏有另一個問題。因爲KingPiece類只有一個構造函數,所以不能在構造函數本身中創建該類的新實例 - 它將生成StackOverflowException。解決方法是創建另一個只能從KingPiece類中調用的私有構造函數。但更好的是,也許你可以告訴我們你想要做什麼,我們可以幫助你。

更新:考慮我猜阿拉什要指定圖像的意見與KingPiece類中使用。如果只使用一張圖片而不依賴於該圖片的顏色,則可以將該參數傳遞給基礎構造函數。

public class KingPiece: ChessPiece { 
    public KingPiece(ChessColor color): 
    // Pass the image to the base class. All king pieces will use this image. 
    base(chess6.Properties.Resources.siyahsah1, color) { 
    .. 
    } 
} 

但是,如果你想爲每種顏色那麼就應該在其他地方或許定義爲靜態字段/屬性不同的圖像。

public class KingPiece: ChessPiece { 
    public static readonly BlackKing = new KingPiece(/* image of the black king here */, ChessColor.Black); 
    public static readonly WhiteKing = new KingPiece(/* image of the white king here */, ChessColor.White); 

    // Constructor could also be made private since you probably don't need other instances beside black and white. 
    public KingPiece(Image image, ChessColor color): base(image, color) { 
    ... 
    } 
} 

希望這會有所幫助。

+0

thanks.i要實現與chessgame國王的運動,並把它的圖片在it.now你能幫助我嗎? – Arash 2010-11-06 19:02:37

+0

@arash - 你爲什麼需要kingPiece字段? – Patko 2010-11-06 19:14:44

+0

@Patko:國王 – Arash 2010-11-06 20:48:48

2

錯誤是自我解釋。 siyahsah1是KingPiece的非靜態私有屬性,在構造函數被調用的時候不會被初始化。

3

你應該招行到構造:

kingPiece = new KingPiece(siyahsah1,ChessColor.White); 

的問題是,你還沒有一個類的實例和編譯器不這樣。如果你只是將行移動到構造函數中,它將起作用。

你仍然必須定義屬性作爲私有字段。您可以這樣做:

private KingPiece kingPiece; 

在第一行的當前位置執行此操作。最終的結果將完全像你現在興起的那樣,除了它會被編譯。

+0

你可以說我在哪裏可以把它們現在完全在我的代碼?謝謝 – Arash 2010-11-06 16:54:19

+0

他會根據堆棧溢出的意見得到堆棧溢出:) – Patko 2010-11-06 16:54:41

+0

@Patko - 狗屎,甚至沒有注意到。 – 2010-11-06 16:58:42

相關問題