在类中使用函数

Using a function inside class

本文关键字:函数      更新时间:2023-10-16

我有一个类定义为示例:

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中使用它。

提前致谢

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

让我们以您的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;
}

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

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