类中的setter不会设置变量 我现在正在尝试用C++做游戏。在我的代码中,我试图嵌套我的变量,这样我的main就不会有太多的include。但我现在的问题是,我的类中变量的值没有改变。在代码中单步显示设置值,但不起作用。有人知道发生了什么吗?先谢谢你

类中的setter不会设置变量 我现在正在尝试用C++做游戏。在我的代码中,我试图嵌套我的变量,这样我的main就不会有太多的include。但我现在的问题是,我的类中变量的值没有改变。在代码中单步显示设置值,但不起作用。有人知道发生了什么吗?先谢谢你,c++,getter-setter,C++,Getter Setter,这就是我到目前为止所做的: 地点.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); pri

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

地点.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
玩家状态

#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;
}

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


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

您当前的问题是

Location GetLocation();
返回位置的副本,因此在此处调用SetName时:

playerStats.GetLocation().SetName("Test");
您正在更改临时副本的名称,并且只要点击分号,更改就会丢失

更广泛地说,这种设计嵌套类和嵌套包括,所以main没有很多的包含,并且使用A.B.C风格的代码来访问嵌套成员不是很棒的C++风格:

拥有一组可传递地包含一组头文件的源文件意味着更改单个头文件将触发对一组源文件的重新编译。编译时间在大型C++项目中可能是一个重要问题,因此通过控制包含的内容来减少编译时间是很重要的。阅读转发声明了解更多信息。 编写像a.b.c这样的代码被认为是糟糕的面向对象设计,因为它减少了封装:调用方不仅必须知道a的细节,还必须知道b的细节。有时,这是编写代码的最方便的方法,但这并不是为了减少包含而盲目地做的事情。更多信息,请阅读德米特定律。
注意这里的代码转储。。。试着在发布前创建一个类似void SetNameconst std::string&value的setter方法。构造函数应该遵循相同的模式。好的,我将把它简化到问题所在。我正在努力避免代码转储。我现在没有什么,我只想说明我的问题在哪里。这些是一些好的观点。那么,我将不得不考虑前瞻性声明。我可以在同一个类中多次使用该方法吗?但我很难理解德米特定律。你能解释一下吗?@WhyYouNoWork-是的,你可以任意多次使用转发声明。唯一复杂的因素是成员变量不能使用前向声明,因为编译器需要完整的类细节来为成员变量布局内存。您可以将前向声明与引用、参数和返回类型、指针和智能指针一起使用,因此使用指向成员变量的智能指针替换直接包含的成员变量是可行的。欲了解更多详情,请发布后续问题;很难在评论中讨论。@WhyYouNoWork-关于德米特,简而言之:main已经知道PlayerStats的内部结构。若它调用PlayerStats.GetLocation.SetName,那个么它也知道位置的内部结构,封装会被削弱。在这种情况下,main可以了解这两个方面,毕竟它是main,但是使用像a.b.c这样的代码而不考虑这些问题并不是很好的面向对象设计。再说一次,评论并不是讨论这个问题的好论坛;程序员Stack Exchange可能已经对Demeter有了更好的解释。我想我现在理解了forward声明,所以谢谢你们。你有没有一个链接我可以用来找到关于德米特法的信息?我找不到任何关于法律的好例子,也找不到如何修复我的代码使其不违法的好例子。@WhyYouNoWork-维基百科有一篇文章;看起来也不错。Demeter是良好OO设计的指南,因此它比转发声明和传递引用更高级;随着你对OO有了更多的经验,这会更有意义。我真的很难理解“按引用传递”。我已经有很多人试图向我解释它们,但我仍然不明白它们是如何工作的。它是如何工作的?
playerStats.GetLocation().SetName("Test");