类中的setter不会设置变量

时间:2014-12-01 18:01:35

标签: c++ getter-setter

我目前正在尝试用C ++制作游戏。在我的代码中,我试图嵌套我的变量,以便我的主要包含很多内容。我现在的问题是,我班上变量的价值没有变化。单步执行代码会显示它设置值,但它不起作用。任何人都知道发生了什么?提前谢谢。

这是我到目前为止所做的:

Location.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

Location.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;}

PlayerStats.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

PlayerStats.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;}

的main.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;
}

2 个答案:

答案 0 :(得分:5)

您的直接问题是

Location GetLocation();

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

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

您正在更改临时副本的名称,一旦分号被点击,更改就会丢失。

更广泛地说,这种设计(嵌套类和嵌套包含主要没有很多包含,并使用abc()样式代码来访问嵌套成员)并不是很好的C ++风格:

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

答案 1 :(得分:2)

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

或者,您可以使用SetLocation()函数。