这是标题定义。
#ifndef ENTITY_H
#define ENTITY_H
//------------------------------------------------------------------------
//
// Name: BaseGameEntity.h
//
// Desc: Base class for a game object
//
// Author: Mat Buckland 2002 (fup@ai-junkie.com)
//
//------------------------------------------------------------------------
#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;
}
在这种情况下,assert语句会检查什么?为什么使用&#34;:&#34;在assert语句中的SetID之后?我知道使用:通过构造函数初始化元素?但这种用法对我来说是新的。
答案 0 :(得分:1)
使用assert
中的<cassert>
宏时,这是常见的技巧。如果宏的参数值为 false ,则宏会失败,然后程序退出时没有任何可读的诊断消息(通常只是{{1}的行号,文件和字符串化条件 })。
也就是说,为了改进诊断消息,可以通过添加将与条件一起打印出来的字符串文字 hack 布尔表达式:
assert()
字符串文字总是计算为布尔assert((val >= m_iNextValidID) && "<BaseGameEntity::SetID>: invalid ID");
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
(因为它是指针),因此,它对条件本身没有影响。但是,当true
条件的第一个操作数失败时,则不满足整个条件(由于其逻辑)并且断言结束程序,打印出来:
&&
然后,看到此消息,可以知道Assertion failed: (val >= m_iNextValidID) && "<BaseGameEntity::SetID>: invalid ID"
方法提供的ID无效。