Illégale appel à la non-fonction membre statique (C++)?
Je suis en train de développer un jeu qui est basé autour de l'utilisateur de contrôler une balle qui se déplace entre les zones de l'écran. La "carte" de l'écran est définie dans le fichier ThreeDCubeGame.cpp:
char m_acMapData[MAP_WIDTH][MAP_HEIGHT];
L'ThreeDCubeGame.cpp il gère la plupart des trucs à faire avec la carte, mais le joueur (ou le clavier) est contrôlé par ThreeDCubePlayer.cpp. Quand un joueur se déplace dans une nouvelle carte de la cellule, le jeu aura pour vérifier le contenu de la cellule et d'agir en conséquence. Cette fonction ThreeDCubeGame.cpp est ce que je suis en train d'utilisation:
inline char GetMapEntry( int iMapX, int iMapY ) { return m_acMapData[iMapX][iMapY]; }
Afin de vérifier si le joueur est autorisé à se déplacer dans un plan de cellule-je utiliser cette fonction appel de ThreeDCubePlayer.cpp:
if (ThreeDCubeGame::GetMapEntry(m_iMapX+MAP_OFF_X, m_iMapY+MAP_OFF_Y) == ' ')
{
//do stuff
}
Mais, quand je compile ce, je reçois le message "erreur C2352: 'ThreeDCubeGame::GetMapEntry' : appel illégal de non-fonction membre statique". Est-ce quelque chose à voir avec la portée des variables? Est-il réparable sans la refonte de tout le code?
OriginalL'auteur benwad | 2009-12-04
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas d'objet pour appeler la fonction avec.
OriginalL'auteur Didier Trosset
GetMapEntry n'est pas
static
de sorte que vous ne peut pas appeler cela sans un objet de type ThreeDCubeGame.Alternatives:
-Faire GetMapEntry statique:
static inline char GetMapEntry
-Créer une instance de ThreeDCubeGame et ne
instance.GetMapEntry(
Vous pouvez utiliser ThreeDCubePlayer.GetMapEntry( ou this->GetMapEntry( à partir de l'intérieur.
OriginalL'auteur Arkaitz Jimenez
ThreeDCubeGame
est une classe, une instance, donc vous ne pouvez l'utiliser pour accéder à des membres statiques (c'est à, membre de la fonction avec le mot-cléstatic
)Vous devez instancier un objet de cette classe pour utilisation non-membres statiques
OriginalL'auteur catchmeifyoutry
Que vous essayez d'appeler une méthode de classe. Est-ce que vous l'intention? Ou voulez-vous dire pour
GetMapEntry
à une méthode d'instance? Si c'est une méthode de classe, il doit être marqué statique. Si c'est une méthode d'instance, vous devez appeler à une instance deThreeDCubeGame
. Aussi, estGetMapEntry
même un membre d'une classe?OriginalL'auteur Nick Lewis
L'erreur indique que vous appelez la
GetMapEntry
fonction statique alors vous devez le déclarer comme une fonction membre. Vous avez besoin de:threedcubegameinstance.GetMapEntry()
,OriginalL'auteur Patrice Bernassola
Vous manque le mot-clé "statique.
Il y a d'autres options si vous voulez un seul et unique terrain de jeu:
Vous pouvez faire de Playfield un singleton, la transformer en un espace de noms ou d'utiliser des fonctions globales.
Le résultat est le même de celui de l'appelant point de vue.
Sur une note de côté:
Depuis toutes ces utiliser un statique et/ou variable globale il est intrinsèquement pas thread-safe.
Si vous avez besoin de plusieurs playfields et/ou souhaitez jouer la sécurité avec multi-threadding et/ou qui veulent absolument le faire dans un POO de la mode, vous aurez besoin d'un exemple de champ d'action à l'appel de la fonction (les " ce " pointeur):
Le code appelant serait d'utiliser le Terrain comme ceci:
OriginalL'auteur smocoder
Il peut être utile d'avoir une classe contenant une collection de fonctions, sans qu'aucun des membres de données, si vous ne voulez pas exposer l'aide des fonctions.
Sinon, il serait plus pratique d'utiliser un espace de noms pour recueillir ces fonctions.
Exemple:
Mais une classe doit être initialisé avant de l'utiliser.
La manière la plus simple de ces fonctions utilisables serait de marquer statique dans la classe:
static void solve_a(std::vector<int> data);
Le membre-fonctions peut être utilisé comme:
Solver::solve_a(my_vector);
Une autre façon serait d'initialiser la classe avant de l'utiliser:
Solver solver;
solver.solve_a(my_vector);
Et la troisième méthode, non mentionné précédemment, est par défaut initialisation en cours d'utilisation:
Solver().solve_a(my_vector);
OriginalL'auteur Farway