我正在尝试实施游戏交易或没有交易,我有两个类,Box&播放器。在框中存储了矢量game_box,并且在玩家中我想存储玩家必须保留的盒子和金钱直到游戏结束。
我试图以这种方式实现它。它运行正常,没有错误,但是当我尝试验证值是否存储到setter中时,它只是让我知道setter是空的。我真的不明白为什么!有谁知道为什么?
class Box
{
vector<Box> game_box;
float pound_contained;
int box_number;
public:
Box(int box_number, float pound_contained);
Box();
int getbox_number();
float getpound_contained();
};
class Player :public Box
{
int player_box;
float player_money;
public:
Player();
~Player();
float getplayer_money();
int getplayer_box();
void setplayer_money(float);
void setplayer_box(int);
};
void Player::setplayer_money(float)
{
player_money = player_money;
}
void Player::setplayer_box(int)
{
player_box = player_box;
}
float Player::getplayer_money()
{
return this->player_money;
}
int Player::getplayer_box()
{
return this->player_box;
}
int main()
{
vector<Box> game_box;
srand(time(0));
int n;
Player money;
Box oper;
float myArray [22][2] = { { 0.01, 0 }, { 0.10, 0 }, { 0.50, 0 },
{ 1, 0 }, { 5, 0 }, { 10, 0 },
{ 50, 0 }, { 100, 0 }, { 250, 0 },
{ 500, 0 }, { 750, 0 }, { 1000, 0 },
{ 3000, 0 }, { 5000, 0 }, { 10000, 0 },
{ 15000, 0 }, { 20000, 0 }, { 35000, 0 },
{ 50000, 0 }, { 75000, 0 }, { 100000, 0 },
{ 250000, 0 }
};
//random assignation of pound value to the 22 boxes
for (int e = 1; e <22; e++)
{
int pos;
bool op = true;
while (op)
{
pos = rand() % 22 + 1;
if (myArray[pos][1] == 0)
{
myArray[pos][1] = 1;
op = false;
}
}
Box b(e, myArray[pos][0]); //creating the class game
game_box.push_back(b); //function of the vector to insert a data in it
}
// random assignment of a box to the player
int i = rand() % 22 + 1;
Box* boxes = &game_box[i];
cout << "Your box is going to be the box number: "<< boxes->getbox_number()<<endl;
////////////////////////////////////////////////////////////////////setter not working
money.setplayer_money(boxes->getpound_contained());
money.setplayer_box(oper.getbox_number());
cout << money.getplayer_box() << " " << money.getplayer_money() << endl << endl;
game_box.erase(game_box.begin()+i);
return 0;
}
答案 0 :(得分:3)
没有&#34; setter&#34;或者&#34; getters&#34;在C ++中与其他方法调用不同。因此,您可以像编写任何其他方法一样编写它们。
要详细说明@maniek指出的问题,你写道:
void Player::setplayer_money(float)
{
player_money = player_money;
}
C和C ++能够指定没有名称的方法和函数参数 - 只是类型。这可能看起来有点奇怪,因为无法访问该参数(至少不是保证在所有编译器或优化级别都能工作的方式,您可以通过messing with the stack来完成)。所以你在这里做的只是将成员player_money
设置为自己。
(注意:如果你想知道为什么它允许你指定一个没有名字的方法参数,它有一些用途......一个是没有命名它会抑制你不是的警告信息使用那个参数。所以这是一种标记某些东西在当前没有使用但仍然需要的方式 - 可能是出于遗留原因,或者可能是因为你将来可能会使用它。)
您可以为不与成员变量名称重叠的参数指定新名称:
void Player::setplayer_money(float new_player_money)
{
player_money = new_player_money;
}
这是避免歧义的一种方法。因为就范围内的值而言,参数将胜过成员变量。所以这将是另一个无操作操作,它将参数值分配给自己:
void Player::setplayer_money(float player_money)
{
player_money = player_money;
}
(注意:由于player_money是按值而不是通过引用传递的,因此不会更改调用站点的参数值。特别是,如果更改值,如果你传递了像10.20
这样的常量。)
@maniek建议的是,在这种情况下消除歧义的方法是在表示成员变量时使用this->player_money
,在表示方法的参数时使用player_money
。有些人做的另一件事是特别命名他们的成员变量 - 比如在m_
中使用m_player_money
启动它们:
void Player::setplayer_money(float player_money)
{
m_player_money = player_money;
}
(注意:只要下一个字符是小写,你也可以使用不带m
的下划线前缀,但是有些人认为这太危险了,因为大写字母后面的下划线是为编译器保留的内部使用。)
最后的想法 - 如果班级名称为Player
,那么它已经隐含了您正在设置的资金(播放器),因此您可以将其称为{{1} }。此外,我不是名字中下划线的粉丝(在C中比在C ++中更常见)所以我可能称之为set_money
。
答案 1 :(得分:1)
怎么样:
void Player::setplayer_money(float player_money)
{
this->player_money = player_money;
}