在类中使用函数
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
。
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 代码在main()中运行,但在函数中出现错误
- 内置函数可查看CPP中的成员变量
- 如何获取std::result_of函数的返回类型
- 如何在c++中为模板函数实例创建快捷方式
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗