0

我和我的朋友正在学习 C++,尽管我们已经能够在这个程序中解决所有遇到的问题(并且通过这样做学到了很多),但这个问题一直让我们绞尽脑汁。我们花费了无数个小时,不仅试图自己解决它,而且还查看了 Stackoverflow 的相关问题并进行了大量的谷歌搜索......最后我们决定我们只需要询问并希望你们中的一个人知道我们的问题是什么.

基本上我们正在尝试创建一个基于文本(仅限控制台)的 RPG,我们已经到了使用我们唯一的头文件中定义的类创建玩家统计信息的地步,该类有三个构造函数(使用函数重载当然)虽然我们能够无错误地运行游戏,但似乎我们无法以任何方式实际编辑类成员变量的值!

这是我们的课:

//File OverHeader.h

class PlayerStatistics
{
public:
    PlayerStatistics(int HitPoints, int MagickaPoints, int Fatigue, int Damage, int Defense, int Dodge, int Block, int SpellCastChance);
    PlayerStatistics(int Experience, int Level);
    PlayerStatistics();

    int HitPoints;
    int MagickaPoints;
    int Fatigue;
    int Damage;
    int Defense;

    // Chance Based System (Relies on Fatigue Level)
    int Dodge;
    int Block;
    int SpellCastChance;

    int Experience;
    int Level;
};

主要功能:

#include <iostream>
#include <string>
#include "OverHeader.h"

// MAIN FUNCTION DEFINITION
int main()
{
PlayerStatistics PlayerStats(20, 20, 20, 20, 20, 20, 20, 20);
PlayerStatistics PlayerStatsLevel(0, 1);

    //continued with code irrelevant to this question.
}

问题是主函数中的行实际上并没有将类中的整数变量设置为这些值。在这两行之后,整数值应设置为(仅用于演示目的):

int HitPoints == 20;
int MagickaPoints == 20;
int Fatigue == 20;
int Damage == 20;
int Defense == 20;
int Dodge == 20;
int Block == 20;
int SpellCostChance == 20;
int Experience == 0;
int Level == 1;

但奇怪的是,输出这些整数中的任何一个都只会输出随机数(大概是内存地址当前值)。

这三个构造函数实际上在这里正确定义(尽管不在 Main.cpp 中):

// PlayerCreation.cpp
PlayerStatistics::PlayerStatistics(int HitPoints, int MagickaPoints, int Fatigue, int Damage, int Defense, int Dodge, int Block, int SpellCastChance)
{

}

PlayerStatistics::PlayerStatistics(int Experience, int Level)
{

}

PlayerStatistics::PlayerStatistics()
{

}

这就是我们的问题,我希望我描述得足够清楚,如果你能帮助我们实际编辑这些类成员变量的值,请告诉我!感谢所有帮助!

4

3 回答 3

4

这会以两种不同的方式创建相同的类:

PlayerStatistics PlayerStats(20, 20, 20, 20, 20, 20, 20, 20);
PlayerStatistics PlayerStatsLevel(0, 1);

第一个创建一个名为的变量,该变量PlayerStats使用第一个构造函数。第二个创建另一个PlayerStatsLevel使用第二个构造函数调用的变量。

现在,构造函数...

// PlayerCreation.cpp
PlayerStatistics::PlayerStatistics(int HitPoints, int MagickaPoints, int Fatigue, int Damage, int Defense, int Dodge, int Block, int SpellCastChance)
{

}

PlayerStatistics::PlayerStatistics(int Experience, int Level)
{

}

这实际上并没有初始化类中的成员变量。您在构造函数中使用了相同的名称,但这实际上会让您感到悲痛,因为(举一个例子)HitPoints传递给构造函数的局部变量会覆盖类成员HitPoints。现在,如果你想引用你必须使用的类成员this->HitPoints

所以,我重申,实际上没有任何东西被初始化。所以你的对象中有随机值。您需要这样做(我将采用较短的示例):

// Using initializer list
PlayerStatistics::PlayerStatistics(int inExperience, int inLevel)
    : Experience(inExperience), Level(inLevel)
{    
}

// Or using conventional assignment
PlayerStatistics::PlayerStatistics(int inExperience, int inLevel)
{    
    Experience = inExperience;
    Level = inLevel;
}

请注意,其他值未使用此构造函数初始化。这可能是有意的,或者您可能希望将它们全部设置为默认值。您需要明确地执行此操作。

现在,看起来您想要一个包含所有这些统计信息的单个实例。您可能想要做的是只使用一个构造函数 - 空构造函数PlayerStatistics(),并将所有内容初始化为“合理”的东西。然后定义函数以分块设置统计信息:

void PlayerStatistics::SetStats(int HitPoints, int MagickaPoints, int Fatigue, int Damage, int Defense, int Dodge, int Block, int SpellCastChance)
{
    this->HitPoints = HitPoints;
    this->MagickaPoints = MagickaPoints;
    // etc etc...
}

void PlayerStatistics::SetLevel(int Experience, int Level)
{
    this->Experience = Experience;
    this->Level = Level;
}

// If you want you can explicitly set the values to something in the constructor.
// It's probably good practice if you're new at this.
PlayerStatistics::PlayerStatistics()
{    
    SetStats(0, 0, 0, 0, 0, 0, 0, 0);
    SetLevel(0, 0);
}

现在在你的主要:

PlayerStatistics player;
player.SetStats(20, 20, 20, 20, 20, 20, 20, 20);
player.SetLevel(0, 1);

或者,如果这些是新玩家的默认设置,请在构造函数中执行,然后您就不需要记住了。

希望这能让你开始。玩得开心,永远不要害怕尝试。

于 2012-09-15T08:43:15.137 回答
1

这些构造函数没有正确定义:它们接受参数,但不对值做任何事情!试试这个:

PlayerStatistics::PlayerStatistics(int Experience, int Level)
:
  Experience(Experience),
  Level(Level)
{

}

这大致相当于:

PlayerStatistics::PlayerStatistics(int Experience, int Level)
{
  this->Experience = Experience;
  this->Level = Level
}

当然,您希望以相同的方式初始化其他字段,并将未指定的字段设置为其默认值,但您明白了。

于 2012-09-15T08:30:52.933 回答
0

你的构造函数没有设置值——构造函数可以有你喜欢的任何参数,并且这些参数不会仅仅因为它们碰巧具有相同的名称而被分配给数据成员。

你需要:

PlayerStatistics::PlayerStatistics(
    int HitPoints, int MagickaPoints, int Fatigue, 
    int Damage, int Defense, int Dodge, int Block, 
    int SpellCastChance) : 
        HitPoints(HitPoints), 
        MagickaPoints(MagickaPoints),
        ... etc ...
{

}

(缩进它你喜欢的方式,我这样做是因为我的代码和你的代码之间的唯一区别似乎没有太大的区别,在右侧的滚动中是不可见的)。

: HitPoints(HitPoints) ...是一个“初始化列表”,它的意思是“用那个值初始化这个基类或数据成员”。在您的情况下,该值恰好与数据成员具有相同的名称,但这很好,编译器会从上下文中找出哪个是哪个。

于 2012-09-15T08:31:08.420 回答