Partage
  • Partager sur Facebook
  • Partager sur Twitter

Transmettre un type entre classe en c#

Sujet résolu
    21 janvier 2018 à 12:34:12

    Bonjour,

    Je fais actuellement face à un problème dans un TP qui est compliqué a expliquer, je vais donc essayer d'être le plus clair possible.

    Nous sommes censé réaliser un TP qui construit des bâtiments (attraction,magasin,maison) sur des cases d'un tableau et via diverse méthode annexe compter combien d'argent le parc nous rapporte, sachant que les bâtiments peuvent âtre améliorer et que les magasins rapportent un pourcentage de la population du parc en fonction de leurs niveau etc. Mon problème est le suivant: j'ai donc implémenté une méthode GetAttractiveness() qui sert a savoir combien de personnes veulent visiter le parc elle dépend donc du nombre d'attraction et de leurs niveau dans le parc. Cette méthode est implémentée dans une classe, la classe Map. Elle fait ensuite appel a une méthode appelée elle aussi GetAttractiveness() mais, qui elle, est implémentée dans la classe Tile. Je vous mets le code de GetAttractiveness() de la classe map puis celui de la classe Tile ci dessous:

    private Tile[,] matrix;
    public Map(string name)
    {
    matrix = TycoonIO.ParseMap(name);
    }
    public long GetAttractiveness()
            {
                var nbLigne = matrix.GetLength(0);
                var nbColonne = matrix.GetLength(1);
                var n = 0;
                var i = 0;
                long acc = 0;
                while (i < nbLigne)
                {
                    while (n < nbColonne)
                    {
                        acc += matrix[n,i].GetAttractiveness(); 
                        n += 1;
                    }
                    n = 0;
                    i += 1;
                }
                return acc;
            }

    Celui de Tile:

    public enum Biome
    {
    SEA, MOUNTAIN, PLAIN
    }

    private Building building;
    private Biome biome;
    public Tile(Biome b)
    {
    Building building = null;
    biome = b;
    }
    public long GetAttractiveness()
            {
                if(building.Type == Building.BuildingType.ATTRACTION)
                {
                    return Attraction.ATTRACTIVENESS[((Attraction) building).Lvl];
                }
                return 0;
            }

    Je vous glisse également le code de la classe Building:

    public abstract class Building
        {
            public enum BuildingType
            {
                NONE, ATTRACTION, HOUSE, SHOP
            }
    
            protected BuildingType type;
             
            public BuildingType Type
            {
                get { return type; }
            }
        }

    Je n'ai pas mis toutes les méthode des classe Tile et Map car celles ci prendraient trop de place mais j'ai mis les constructeurs ainsi que les méthodes "concernées". 

    Le problème est le suivant, lorsque que je lance le débugger sur ce programme et qu'il arrive à la ligne "acc += matrix[n,i].GetAttractiveness();" celle-ci enmène bien le programme sur la fonction Tile.GetAttractiveness() cependant elle ne récupère pas le type de batiment présent sur la case matrix[n,i]. Par conséquent l'instruction "building.Type" a la valeur null et le programme renvoie une erreur de type NullReference.

    En espérant avoir été au minimum clair, je remercie d'avance celle et ceux qui voudront m'aider.

    Bonnée journée.



    • Partager sur Facebook
    • Partager sur Twitter
      21 janvier 2018 à 13:51:42

      Building.Type ne peut valoir null, car Type de type BuildingType est une enum et donc un type intégral non nullable.

      Ici c'est building tout court qui vaut null et donc l'accès à son type qui provoque le plantage.

      Et tout ceci semble logique et cohérent vu que dans le constructeur de Tile tu mets building à null (ce qui au passage est inutile c'est déjà sa valeur par défaut)

      • Partager sur Facebook
      • Partager sur Twitter
      Censément, quelqu'un de sensé est censé s'exprimer sensément.
        21 janvier 2018 à 13:59:16

        Le sujet du TP spécifie qu'il faut initialiser la valeur de building a null dans le constructeur.  Je te mets une capture de ce que le debugger affiche (désolé pour le grossissement c'est un screenshot):

        • Partager sur Facebook
        • Partager sur Twitter
          21 janvier 2018 à 14:14:36

          Je m'en fiche un peu de se que dit le TP (no offense) si building est null (pour quelque raison que ce soit) faut pas s'étonner derrière qu'il soit null

          Que ça soit sur un if ou pas faire building.Type avec building nullça reste faire null.Type et donc ça plante, point barre

          • Partager sur Facebook
          • Partager sur Twitter
          Censément, quelqu'un de sensé est censé s'exprimer sensément.
            21 janvier 2018 à 14:27:54

            J'ai essayé en laissant la valeur par défaut mais cela renvoie quand même une erreur.
            • Partager sur Facebook
            • Partager sur Twitter
              21 janvier 2018 à 14:49:56

              Sehnsucht a écrit:

              Dans le constructeur de Tile tu mets building à null (ce qui au passage est inutile **c'est déjà sa valeur** par défaut)


              Donc oui donner null soi-même ou laisser le null par défaut c'est bonnet blanc et blanc bonnet

              -
              Edité par Sehnsucht 21 janvier 2018 à 14:50:15

              • Partager sur Facebook
              • Partager sur Twitter
              Censément, quelqu'un de sensé est censé s'exprimer sensément.
                26 janvier 2018 à 14:45:30 - Message modéré pour le motif suivant : Les insultes ne sont pas tolérées


                  26 janvier 2018 à 15:19:22

                  Je  ne vois pas très bien comment exécuter correctement le reste du programme si dans le constructeur ça doit être null. Si c'était par recopie, avec arguments, il y aurai toujours moyen. mais la avec un constructeur avec zéro argument...
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Tu as oublié un point virgule...     (/ °^°)/ [_;?_]  >(°~°' |>)

                  Transmettre un type entre classe en c#

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown