Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对对象执行getter吗?_C++ - Fatal编程技术网

C++ 对对象执行getter吗?

C++ 对对象执行getter吗?,c++,C++,我的游戏课是由一艘宇宙飞船组成的。 我把宇宙飞船的物体放在了私人空间,我为这个物体做了一个getter Spaceship Game::getSpaceShip() const { return mySpaceship; } 当我使用我的飞船对象通过我的getter在我的主要,它不能正常工作。如果我把它公之于众,只使用它的名字,它的工作。您知道是什么导致了这个问题吗?您正在返回MySpace副本。尝试返回指向MySpace对象的指针 Spaceship *Game::getSpaceS

我的游戏课是由一艘宇宙飞船组成的。 我把宇宙飞船的物体放在了私人空间,我为这个物体做了一个getter

Spaceship Game::getSpaceShip() const
{
    return mySpaceship;
}

当我使用我的飞船对象通过我的getter在我的主要,它不能正常工作。如果我把它公之于众,只使用它的名字,它的工作。您知道是什么导致了这个问题吗?

您正在返回MySpace副本。尝试返回指向MySpace对象的指针

Spaceship *Game::getSpaceShip()
{
    return &mySpaceship;
}
或参考:

const Spaceship& Game::getSpaceShip() const
{
    return mySpaceship;
}
它不是Java。在C++中,你传递和返回变量的值!除非您通过指针或引用指示要以不同的方式进行操作

Spaceship& Game::getSpaceShip()
{
    return mySpaceship;
}
如果需要修改返回的引用

Spaceship& Game::getSpaceShip()
{
    return mySpaceship;
}

您正在返回MySpace副本。尝试返回指向MySpace对象的指针

Spaceship *Game::getSpaceShip()
{
    return &mySpaceship;
}
或参考:

const Spaceship& Game::getSpaceShip() const
{
    return mySpaceship;
}
它不是Java。在C++中,你传递和返回变量的值!除非您通过指针或引用指示要以不同的方式进行操作

Spaceship& Game::getSpaceShip()
{
    return mySpaceship;
}
如果需要修改返回的引用

Spaceship& Game::getSpaceShip()
{
    return mySpaceship;
}
你的方法

Spaceship Game::getSpaceShip() const;
按值返回宇宙飞船。这意味着调用方将获得自己的Spaceship实例,该实例是从MySpace初始化的

正如yattering所说,如果希望调用方使用相同的实例,那么应该返回对该对象的引用

现在,我希望看到的两种访问器方法是:

Spaceship const& getSpaceship() const { return mySpaceship; }
Spaceship&       getSpaceship()       { return mySpaceship; }
第一种方法返回一个对const Spaceship的引用:你不能通过这个引用修改飞船,但是多个调用方可以查看相同的状态,如果他们只对游戏本身有一个const引用的话

第二个返回对Spaceship的引用:这是完全的读写访问,但需要对游戏的非常量引用才能获得它

如果有帮助,考虑比飞船更简单的事情:

class Wrapper {
    int value;

public:
    int        copy_of_value()            const { return value; }
    int&       reference_to_value()             { return value; }
    int const& const_reference_to_value() const { return value; }
};
现在,这些都表现得不同:

Wrapper w;
int i = w.copy_of_value();
i += 1; // changes i but not w.value

int &j = w.reference_to_value();
j += 1; // does change w.value

int const& k = w.const_reference_to_value();
k += 1; // won't even compile
请注意,如果我一开始只对w进行常量引用,我可以调用两个常量限定方法,但不能将_引用到_值,因此常量阻止我更改w.value。

您的方法

Spaceship Game::getSpaceShip() const;
按值返回宇宙飞船。这意味着调用方将获得自己的Spaceship实例,该实例是从MySpace初始化的

正如yattering所说,如果希望调用方使用相同的实例,那么应该返回对该对象的引用

现在,我希望看到的两种访问器方法是:

Spaceship const& getSpaceship() const { return mySpaceship; }
Spaceship&       getSpaceship()       { return mySpaceship; }
第一种方法返回一个对const Spaceship的引用:你不能通过这个引用修改飞船,但是多个调用方可以查看相同的状态,如果他们只对游戏本身有一个const引用的话

第二个返回对Spaceship的引用:这是完全的读写访问,但需要对游戏的非常量引用才能获得它

如果有帮助,考虑比飞船更简单的事情:

class Wrapper {
    int value;

public:
    int        copy_of_value()            const { return value; }
    int&       reference_to_value()             { return value; }
    int const& const_reference_to_value() const { return value; }
};
现在,这些都表现得不同:

Wrapper w;
int i = w.copy_of_value();
i += 1; // changes i but not w.value

int &j = w.reference_to_value();
j += 1; // does change w.value

int const& k = w.const_reference_to_value();
k += 1; // won't even compile


请注意,如果我一开始只对w进行常量引用,我可以调用两个常量限定方法,但不引用w到w值,因此常量阻止我更改w.value。

你说它不能正常工作是什么意思?它的行为与我在没有getter的情况下使用它时的行为不同。例如,game.mySpaceship.modifyPositionkey;与game.getMySpaceship.modifyPositionkey相比,将正常工作;您可能需要返回一个引用或指针。@Brendan Long真的吗?你能解释一下吗?你说它不能正常工作是什么意思?它的行为与我在没有getter的情况下使用它的行为不同。例如,game.mySpaceship.modifyPositionkey;与game.getMySpaceship.modifyPositionkey相比,将正常工作;您可能需要返回一个引用或指针。@Brendan Long真的吗?您能解释一下吗?从const方法返回对数据成员的非const引用可能是个坏主意。您的第一个建议给了我以下错误消息:返回值类型与函数类型不匹配。我会尝试第二个建议。我做的和你做的完全一样,这是有道理的,但我不知道为什么会出现这个错误是的,juan是对的,如果我返回一个常量,它会工作,但我不能再修改对象了。所以将函数签名更改为非常量。记住在标题中也要更改它。问题是给定一个对游戏的常量引用,你不应该能够获得对其成员的非常量引用。这就是const限定方法无法返回非const引用的原因。从const方法返回对数据成员的非const引用可能是个坏主意。您的第一个建议给了我以下错误消息:返回值类型与函数类型不匹配。我会尝试第二个建议。我做的和你做的完全一样,这是有道理的,但我不知道为什么会出现这个错误是的,juan是对的,如果我返回一个常量,它会工作,但我不能再修改对象了。所以将函数签名更改为非常量。记住在标题中也要更改它。问题是给定一个对游戏的常量引用,你不应该能够获得对其成员的非常量引用。这就是常量限定方法无法返回非常量引用的原因_ 缺少值。在对值的引用中缺少值。