0

我尝试实现 Scott Mayer 书中的代码示例,示例是关于通过函数对象调用函子

头文件 gameCharachter.h

#ifndef GAMECHARACTER_H
#define GAMECHARACTER_H

#include <iostream>
#include <typeinfo>
using namespace std;
#include <tr1/functional>

class GameCharacter;

int defaultHealthCalc(const GameCharacter& gc);

class GameCharacter
{

public:

    typedef std::tr1::function<int (const GameCharacter&)> HealthCalcFunc;

    explicit GameCharacter(HealthCalcFunc hcf = defaultHealthCalc)

        : healthFunc(hcf)
    {
    }

    ~GameCharacter()
    {
    }

    int healthValue() const
    {
        return healthFunc(*this);
    }
private:

    HealthCalcFunc healthFunc;

};

class EyeCandyCharacter:   public GameCharacter    // another character
{

public:

    explicit EyeCandyCharacter(HealthCalcFunc hcf = defaultHealthCalc)

        : GameCharacter(hcf)
    {
        cout<<typeid(*this).name()<<"::"<<__FUNCTION__<<""<<endl;

    }                                           

};   

struct HealthCalculator                          
{
    /*explicit*/ HealthCalculator()
    {

    }

    int operator()(const GameCharacter& gc) const     // calculation function
    {
        cout<<typeid(*this).name()<<"::"<<__FUNCTION__<<""<<endl;
           return 0;
    }                                        

};

#endif // GAMECHARACTER_H

main.cpp 是:

#include "gamecharacter.h"

int main()
{
    EyeCandyCharacter ecc1(HealthCalculator());       
    ecc1.healthValue();
}

为什么 function<> 对象拒绝在 healthvalue() 中调用 operator() 函数

4

2 回答 2

1

EyeCandyCharacter ecc1(HealthCalculator());

声明一个被调用的函数,该函数ecc1接受一个类型为“指向不接受参数并返回 a 的函数的指针”的参数,HealthCalculator并返回一个EyeCandyCharacter. 我认为这不是你的意图。

于 2015-02-27T08:28:33.350 回答
0

这是正确的调用,它应该由 bind 调用

#include "gamecharacter.h"

int main()
{
    HealthCalculator hc;
    EyeCandyCharacter ecc1(std::tr1::bind(&HealthCalculator::operator(),hc,tr1::placeholders::_1));
    ecc1.healthValue();
}
于 2015-02-28T06:41:17.823 回答