2010-11-06 34 views
0

lorsque i compiler le code ci-dessous le compilateur donne l'erreur: un initialiseur de domaine ne peut pas référencer le champ non statique, la méthode ou la propriété dans cette code (qui ont des étoiles)erreur de compilation: un initialiseur de domaine ne peut pas référencer le champ non statique, la méthode ou la propriété

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

Quelqu'un peut-il m'aider?

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

S'il vous plaît ne pas poster le code unrelevant, il rend la lecture difficile, le CLAS du Conseil dans votre exemple est hors de propos à votre question. En plus de rendre la classe conseil comme imbriqué à PiecePosition est un peu étrange –

Répondre

1

Comme d'autres l'ont dit, siyahsah1 est un champ privé non statique, qui ne peut pas être utilisé pour initialiser d'autres champs. Mais vous avez un autre problème ici. Parce que la classe KingPiece a un seul constructeur, vous ne pouvez pas créer une nouvelle instance de cette classe dans le constructeur lui-même - il va produire un StackOverflowException. Contournement serait de créer un autre constructeur privé qui ne pouvait être appelé qu'à partir de la classe KingPiece. Mais mieux encore, vous pourriez peut-être nous dire exactement ce que vous voulez faire et nous pouvons vous aider avec cela. Mise à jour: Considérant les commentaires, je suppose que arash veut spécifier l'image à utiliser avec la classe KingPiece. Si une seule image est utilisée indépendamment de la couleur de la pièce, vous pouvez simplement passer cet argument au constructeur de base.

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) { 
    .. 
    } 
} 

Mais si vous voulez avoir des images différentes pour chaque couleur alors que devrait être défini ailleurs ou peut-être comme un champ/propriété statique.

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) { 
    ... 
    } 
} 

Espérons que cela aide.

+0

merci.je veux mettre en œuvre des mouvements de roi dans le jeu d'échecs avec et mettre son image dans it.now pouvez-vous m'aider? – Arash

+0

@arash - Pourquoi avez-vous besoin du champ kingPiece? – Patko

+0

@Patko: pour tous les mouvements valides du roi – Arash

2

L'erreur est auto-explicative. siyahsah1 est une propriété privée non statique de KingPiece et n'est pas initialisée au moment où le constructeur est appelé.

3

Vous devez déplacer la ligne dans le constructeur:

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

Le problème est que vous n'avez pas encore une instance de classe et le compilateur ne fonctionne pas comme ça. Si vous déplacez simplement la ligne dans le constructeur, cela fonctionnera.

Vous aurez encore à définir la propriété comme un champ privé. Vous pouvez le faire avec:

private KingPiece kingPiece; 

Procédez ainsi à l'emplacement actuel de la première ligne. Le résultat final sera exactement comme ce que vous avez maintenant, sauf qu'il compilera.

+0

pouvez-vous me dire où je peux les mettre maintenant exactement dans mon code grâce – Arash

+0

Et il se débordement de la pile en fonction des conseils de débordement de la pile :) – Patko

+0

@Patko - Merde, n'a même pas remarqué. –