Salut,
De manière générale, une erreur de segmentation survient systématiquement lorsqu'on essaye de déréférencer un pointeur représentant une adresse invalide.
Dans le cas présent, la ligne extern Game * game; indique qu'il (devrait) exister "quelque part" une variable globale nommée game qui prend la forme d'un pointeur sur un objet de type Game, soit...
Mais, dans le code que tu nous présente, on n'a absolument aucune raison de croire que ce pointeur représente bel et bien l'adresse mémoire à laquelle se trouve un tel objet. Nous devons donc partir du principe que ce n'est pas le cas.
Avant d'appeler ton constructeur de Tile, il faut donc au moins t'assurer que l'objet pointé par game existe bel et bien.
Ensuite, on remarque le code
game->grid->getGridValue(i,j);
qui tend à indiquer:
- que game est un pointeur (mais ca, on le savait)
- que game->grid est un pointeur
La question est : grid représente-t-il bel et bien une adresse valide 
Et, le problème, c'est que l'on n'a aucun moyen de savoir si c'est bel et bien le cas dans le code que tu présente.
De plus, à voir ta class Grid, il n'y a aucune raison pour que le membre grid de ta classe Game soit un pointeur... Dés lors, pourquoi te faire du mal en utilisant (mal, de toute évidence) des pointeurs là où il n'y a aucune raison d'en avoir 
Pourrais tu nous montrer le code correspondant à ta classe Game, cela nous permettrait déjà de nous faire une idée bien plus précise du problème 
TIP 1 Lorsque tu travailles avec des pointeurs, tu devrais au minimum vérifier de manière systématique que le pointeur est valide à l'aide d'une assertion (car, si le pointeur n'est pas valide, c'est une erreur de programmation)
Vu que tu essaye d'accéder à game->grid, ton constructeur pourrait t'indiquer exactement "ce qui ne se passe pas bien" en ajoutant deux assertion, sous la forme de
1 2 3 4 5 6 7
|
Tile::Tile(int value)
{
assert(game!=nullptr); // plante si game n'est pas valide
assert(game->grid != nullptr); // plante si game->grid n'est pas valide
/* la suite */
}; |
Si tu prend bien la peine d'intialiser tes pointeurs à nullptr lorsque tu ne peux pas leur donner de valeur valide ou après avoir détruit les objets pointés, cela devrait déjà te permettre de trouver où l'erreur se cache 
TIP 2 getGridValue devrait être une fonction constante, car elle devrait s'engager à ne pas modifier l'état de l'objet de type Grid
TIP 3 rand et srand sont des reliquats d'un autre age. Tu devrais t'intéresser au fichier d'en-tête <random>
TIP 4 srand a pour objectif d'initialiser la "graine" du générateur aléatoire. Cette fonction ne devrait être utilisée qu'une seule fois. Or, elle est appelée de manière systématique dans le constructeur de Tile, ce qui laisse supposer qu'elle sera appelée un nombre assez important de fois 
TIP 5Plutôt que d'utiliser un tableau à deux dimensions pour ta grille, pourquoi n'utiliserais tu pas un tableau "tout simple" capable de contenir 16 éléments, vu que c'est ce que tu souhaites avoir... Au niveau de l'interface de Grid, cela ne changera rien, mais tu as tout à y gagner 
TIP 6 Depuis l'arrivée de C++11, les tableau de taille fixes, c'est std::array 
TIP 7 Les variables globales C'EST MAL !!!
Partager