2014-09-09 2 views
-3

c'est la définition d'en-tête.ne comprend pas cette utilisation de assert dans cette classe

#ifndef ENTITY_H 
#define ENTITY_H 
//------------------------------------------------------------------------ 
// 
// Name: BaseGameEntity.h 
// 
// Desc: Base class for a game object 
// 
// Author: Mat Buckland 2002 ([email protected]) 
// 
//------------------------------------------------------------------------ 
#include <string> 

#include "messaging/Telegram.h" 


class BaseGameEntity 
{ 

private: 

    //every entity must have a unique identifying number 
    int   m_ID; 


    static int m_iNextValidID; 

    void SetID(int val); 

public: 

    BaseGameEntity(int id) 
    { 
    SetID(id); 
    } 

    virtual ~BaseGameEntity(){} 

    //all entities must implement an update function 
    virtual void Update()=0; 

    //all entities can communicate using messages. They are sent 
    //using the MessageDispatcher singleton class 
    virtual bool HandleMessage(const Telegram& msg)=0; 

    int   ID()const{return m_ID;} 
}; 

#endif 

/////////////// here begins the cpp definition 

#include "BaseGameEntity.h" 
#include <cassert> 


int BaseGameEntity::m_iNextValidID = 0; 


void BaseGameEntity::SetID(int val) 
{ 
    //make sure the val is equal to or greater than the next available ID 
    assert ((val >= m_iNextValidID) && "<BaseGameEntity::SetID>: invalid ID"); 

    m_ID = val; 

    m_iNextValidID = m_ID + 1; 
} 

Qu'est-ce que la vérification d'instruction assert dans ce cas? Et pourquoi l'utilisation de ":" après SetID dans assert déclaration? Je connais l'utilisation de: initialiser des éléments via un constructeur? Mais cet usage est nouveau pour moi.

+0

Je ne vois pas le point de l'affirmation. Cela réussira toujours. –

+1

S'il vous plaît ne pas poser cinq questions indépendantes en une. –

+4

Etes-vous sûr d'avoir correctement copié le code? Il y a beaucoup de petites erreurs telles que confondre 'ID' et' m_ID'. En outre, je ne peux pas voir ':?'. – 5gon12eder

Répondre

1

Ceci est un commun astuce lors de l'utilisation assert macro de <cassert>. La macro échoue si son argument évalue à faux, puis le programme se termine sans aucun message de diagnostic lisible (généralement juste un numéro de ligne, fichier et condition stringifiée de assert()).

C'est, pour améliorer le message de diagnostic, on peut pirater l'expression booléenne en ajoutant une chaîne de caractères qui sera imprimé conjointement avec la condition:

assert((val >= m_iNextValidID) && "<BaseGameEntity::SetID>: invalid ID"); 
//         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

La chaîne littérale Evalue toujours à booléen true (parce que c'est un pointeur), par conséquent, il n'a aucun impact sur la condition elle-même. Cependant, lorsque le premier opérande de && état échoue, l'ensemble condtion ne se satisfait pas (en raison de sa logique) et assert termine le programme, imprimer:

Assertion failed: (val >= m_iNextValidID) && "<BaseGameEntity::SetID>: invalid ID" 

Puis, voyant ce message, on peut savoir que l'ID fourni pour la méthode SetID n'était pas valide.

Questions connexes