首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何通过其他.cpp文件中的类变量编辑公共成员变量?

如何通过其他.cpp文件中的类变量编辑公共成员变量?
EN

Stack Overflow用户
提问于 2012-09-15 16:26:07
回答 3查看 4.3K关注 0票数 0

我和我的朋友正在学习C++,虽然我们已经能够解决这个程序中遇到的每个问题(并从中学到了一大堆东西),但这个问题让我们整天绞尽脑汁。我们已经花费了无数的时间,不仅试图自己解决这个问题,而且还查看了Stackoverflow的相关问题,并进行了大量的谷歌搜索……最后,我们决定,我们只需要问一问,希望你们中的一个人知道我们的问题是什么。

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

这是我们的班级:

代码语言:javascript
运行
复制
//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;
};

其主要功能是:

代码语言:javascript
运行
复制
#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.
}

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

代码语言:javascript
运行
复制
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中):

代码语言:javascript
运行
复制
// 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()
{

}

这就是我们的问题,我希望我描述得足够清楚,请让我知道你是否可以帮助我们实际编辑这些类成员变量的值!感谢所有的帮助!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-15 16:43:15

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

代码语言:javascript
运行
复制
PlayerStatistics PlayerStats(20, 20, 20, 20, 20, 20, 20, 20);
PlayerStatistics PlayerStatsLevel(0, 1);

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

现在,构造函数..。

代码语言:javascript
运行
复制
// 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

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

代码语言:javascript
运行
复制
// 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(),然后把所有的东西都初始化成一些“合理”的东西。然后定义函数来按块设置统计数据:

代码语言:javascript
运行
复制
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);
}

现在,在你的main中:

代码语言:javascript
运行
复制
PlayerStatistics player;
player.SetStats(20, 20, 20, 20, 20, 20, 20, 20);
player.SetLevel(0, 1);

或者,如果这些是新播放器的默认值,那么在构造函数中这样做,这样你就永远不需要记住了。

希望这能帮你入门。玩得开心,永远不要害怕尝试。

票数 4
EN

Stack Overflow用户

发布于 2012-09-15 16:30:53

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

代码语言:javascript
运行
复制
PlayerStatistics::PlayerStatistics(int Experience, int Level)
:
  Experience(Experience),
  Level(Level)
{

}

这大致相当于:

代码语言:javascript
运行
复制
PlayerStatistics::PlayerStatistics(int Experience, int Level)
{
  this->Experience = Experience;
  this->Level = Level
}

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

票数 1
EN

Stack Overflow用户

发布于 2012-09-15 16:31:08

您的构造函数不设置值--构造函数可以有您喜欢的任何参数,而且这些参数不会分配给数据成员,因为它们恰好具有相同的名称。

您需要:

代码语言:javascript
运行
复制
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) ...是一个“初始化列表”,意思是“用那个值初始化这个基类或数据成员”。在您的示例中,值恰好与数据成员具有相同的名称,但这很好,编译器会从上下文中找出哪个是哪个。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12435796

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档