在类中使用函数

时间:2017-07-03 08:22:15

标签: c++ function class recursion

我将一个类定义为示例:

class Rectangle {
    int width, height;
  public:
    void set_values (int,int);
    int area (void);
} ;

假设区域计算很复杂,为了清洁和可读,我想使用display_result();order_items(int x, int y);等函数。我怎样才能做到这一点 ?一般的问题是如何在c ++中的类中使用函数。

我的具体案例:

bool AlphaBetaAI::computeMove (PangScenario *ps, int playerNumber, int *move)
{
        int alpha=-Number_MAX_VALUE;
        int beta= Number_MAX_VALUE;
        float childValue;
        int score;

        vector<int> legalMovements;
        legalMovements.push_back(1); //Move right
        legalMovements.push_back(2); //Move left
        legalMovements.push_back(3); //stop
        legalMovements.push_back(4); //Shoot

        vector< pair<float,int> > lista;

        PangScenario *pangCopy = new PangScenario(*ps);

        //score=myPacman->getPoints(); Si quiero arrastrar los puntos ya conseguidos por pacman antes de tomar decision
        score=0; //Si quiero empezar desde 0 a partir del momento que calculo la decisión.

        lista.clear();

        for ( int i=0; i < legalMovements.size();i++)
            {
                if ( legalMovements[i] != 0)
                {
                    switch (legalMovements[i])
                    {
                        case 1: //North
                                pangCopy->characterPlayerOne->moveRight();
                                childValue = minimaxAlphaBeta(pangCopy, alpha, beta, score, 1, depth-1, jugador+1);
                                lista.push_back(make_pair(childValue,1));
                                break;
                        case 2: //South
                                CharactersLocationsMaze[playerRow]=sr+1;
                                CharactersLocationsMaze[playerColumn]=sc;
                                childValue= minimaxAlphaBeta(mazeTemp,CharactersLocationsMaze, alpha, beta, score, 2, depth-1, jugador+1);
                                lista.push_back(make_pair(childValue,2));
                                break;
                        case 3: //West
                                CharactersLocationsMaze[playerRow]=sr;
                                CharactersLocationsMaze[playerColumn]=sc-1;
                                childValue= minimaxAlphaBeta(mazeTemp,CharactersLocationsMaze, alpha, beta, score, 3, depth-1, jugador+1);
                                lista.push_back(make_pair(childValue,3));
                                break;
                        case 4: //East
                                CharactersLocationsMaze[playerRow]=sr;
                                CharactersLocationsMaze[playerColumn]=sc+1;
                                childValue = minimaxAlphaBeta(mazeTemp,CharactersLocationsMaze, alpha, beta, score, 4, depth-1, jugador+1);
                                lista.push_back(make_pair(childValue,4));
                                break;
                        }

                }
            }//for

//more code not relevant to the question
    }

我计算某种剧游戏的举动。要计算最佳运动id必须使用5的深度递归调用minimaxAlphabeta。所以我必须声明并定义minimaxAlphabeta并在类computemove中使用它。

提前致谢

2 个答案:

答案 0 :(得分:0)

如果我理解正确,你的问题不是关于使用方法,而是关于优化繁重的计算。

让我们以Rectangle为例:

class Rectangle {
    int width, height;
  public:
    void set_values (int,int);
    int area (void);
} ;

假设计算area并不重,可以在方法本身中完成,这是一个清晰,直接且简单的方法示例。但是,如果计算很复杂,我们需要进行一些优化。

最简单的解决方案是仅在有意义时计算面积,而不是总是如此。为此,我们可以保存boolean,表示需要更新值:

class Rectangle {
    float width=0.0, height=0.0;
    bool area_to_update = true;
    float area_last_value = 0.0;
  public:
    void set_values (float, float);
    float area ();
} ;

float Rectangle::area()
{
    if (area_to_update)
    {
        // ... Make complex calculation here, save it to area_last_value
        area_to_update = with*height;
        // save that the area is now correct.
        area_to_update = false;
    }
    // return the new result
    return area_to_update;
}

默认情况下,需要更新该值,因此第一次调用area将触发计算,之后的调用将返回相同的值,直到需要更新为止。

当更改任何值时,area需要再次更新:

void Rectangle::set_values(float w, float h)
{
    // ... Update values here
    bool value_changed = (w!=width || h!=height);
    width= w;
    height = h;
    // Check if the value has really changed, and set area to be updated.
    if ( value_changed) area_to_update = true;
}

答案 1 :(得分:0)

在类中使用函数很简单。例如:

class Foo
{
    int x;
public:
    void bar();
    void baz();
};

void Foo::bar()
{
    x = 3;
}

void Foo::baz()
{
    bar(); // inside another class function (of same class), you just call it
}

int main()
{
    Foo f;
    f.baz(); // outside you need an instance, call with dot
}

关于该行的说明

PangScenario *pangCopy = new PangScenario(*ps);

请不要使用new,常规变量就足够了, 因为pangCopy可能不需要比AlphaBetaAI::computeMove更长寿。 此外,在该功能中,更喜欢通过引用获取ps