类中的二传手不会设置变量



我目前正在尝试用C++制作游戏。在我的代码中,我试图嵌套我的变量,以便我的 main 没有很多包含。不过,我现在的问题是我的类中变量的值没有改变。单步执行代码时,它显示它设置了值,但它不起作用。有人知道发生了什么吗?提前谢谢你。

这是我到目前为止所拥有的:

位置.h

#ifndef LOCATION_H
#define LOCATION_H
#include <string>
class Location
{
public:
    Location(void);
    Location(std::string name);
    ~Location(void);
    std::string GetName();
    void SetName(std::string value);
private:
    std::string m_Name
};
#endif

位置.cpp

#include "Location.h"
Location::Location(void): m_Name("") {}
Location::Location(std::string name): m_Name(name) {}
Location::~Location(void)
{
}
std::string Location::GetName()
{return m_Name;}
void Location::SetName(std::string value){m_Name = value;}

球员统计.h

#ifndef PLAYERSTATS_H
#define PLAYERSTATS_H
#include "Location.h"
class PlayerStats
{
public:
    PlayerStats(void);
    ~PlayerStats(void);
    Location GetLocation();
    void SetLocation(Location location);
private:
    Location m_Location;
};
#endif

球员统计.cpp

#include "PlayerStats.h"
PlayerStats::PlayerStats(void): m_Location(Location()) {}
PlayerStats::~PlayerStats(void)
{
}
Location PlayerStats::GetLocation(){return m_Location;}
void PlayerStats::SetLocation(Location location){m_Location = location;}

主.cpp

#include <iostream>
#include "PlayerStats.h"
using namespace std;
PlayerStats playerStats = PlayerStats();
int main()
{
    playerStats.GetLocation().SetName("Test");
    cout<< playerStats.GetLocation().GetName()<<endl;
    return 0;
}

您的直接问题是

Location GetLocation();

返回位置的副本,因此当您在此处调用 SetName 时:

playerStats.GetLocation().SetName("Test");

您正在更改临时副本的名称,并且一旦命中分号,更改就会丢失。

更广泛地说,这种设计(嵌套类和嵌套包含,以便main没有很多包含,并使用a.b.c((样式代码访问嵌套成员(不是很好的C++风格:

    拥有一堆
  • (可传递地(包含一堆头文件的源文件意味着更改单个头文件将触发一堆源文件的重新编译。在较大的C++项目中,编译时间可能是一个重大问题,因此通过控制 #include 来减少编译时间非常重要。 阅读"前瞻声明"以获取更多信息。
  • 编写像a.b.c()这样的代码被认为是糟糕的面向对象设计,因为它减少了封装:调用者不仅必须知道a的细节,它还必须知道b的细节。 有时这是编写代码的最方便的方法,但这并不是为了减少 #include 而盲目地这样做。 阅读"得墨忒耳定律"了解更多信息。
如果你想

设置playerStats.GetLocation()的结果,你可以GetLocation()按引用传递(在返回参数上使用&号(。 否则,您只是在 PlayerStats::m_Location 的临时副本中设置值。

或者,您可以使用SetLocation()功能。

最新更新