不要理解这个类中断言的这种用法

时间:2014-09-09 16:58:39

标签: c++11

这是标题定义。

   #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之后?我知道使用:通过构造函数初始化元素?但这种用法对我来说是新的。

1 个答案:

答案 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无效。