C++ 在这个简单的示例中,如何通过引用传递枚举?

C++ 在这个简单的示例中,如何通过引用传递枚举?,c++,enums,C++,Enums,我的代码中有一个问题,我用这个简单的例子来说明它 我有一个具有公共枚举PlayerType的Player类。我有一个带有createPlayer方法的Manager类,该方法接受对播放器和播放器类型的引用 但是我不能编译它——注意,我不能更改createPlayer方法的签名,每个参数必须是一个对象引用 我做错了什么 Player.h #ifndef PLAYER_H #define PLAYER_H using namespace std; class Player { public:

我的代码中有一个问题,我用这个简单的例子来说明它

我有一个具有公共枚举PlayerType的Player类。我有一个带有createPlayer方法的Manager类,该方法接受对播放器和播放器类型的引用

但是我不能编译它——注意,我不能更改createPlayer方法的签名,每个参数必须是一个对象引用

我做错了什么

Player.h

#ifndef PLAYER_H
#define PLAYER_H

using namespace std;

class Player {
  public:
    Player();
    enum PlayerType { FORWARD, DEFENSEMAN, GOALIE };
    void setType(PlayerType);
  private:
    PlayerType type;
};

#endif
Player.cc

#include <iostream>

using namespace std;

#include "Player.h"

Player::Player() {
}

void Player::setType(PlayerType type) {
  this->type = type;
}
Manager.cc

#include <iostream>

using namespace std;

#include "Player.h"

#include "Manager.h"

void Manager::createPlayer(Player& player, PlayerType& playerType) {
  cout << "inside Manager::createPlayer" << endl;
}
我该怎么做才能让它工作?

您需要更改

void createPlayer(Player&Player,Player::PlayerType&PlayerType)

void createPlayer(Player&Player,const Player::PlayerType&PlayerType)

作为参数传递Player::FORWARD将创建一个临时PlayerType值,该值只能作为常量引用或按值传递。

您需要更改

void createPlayer(Player&Player,Player::PlayerType&PlayerType)

void createPlayer(Player&Player,const Player::PlayerType&PlayerType)


将Player::FORWARD作为参数传递将创建一个临时PlayerType值,该值只能作为常量引用或按值传递。

要使用引用,需要将该值存储到变量中

int main() {

  Manager manager;
  Player player;
  Player::PlayerType t = Player::FORWARD;
  manager.createPlayer(player,t);

  return 0;
}

为了能够使用引用,您需要将值存储到变量中

int main() {

  Manager manager;
  Player player;
  Player::PlayerType t = Player::FORWARD;
  manager.createPlayer(player,t);

  return 0;
}

问题是在这个电话里

manager.createPlayer(player, Player::FORWARD);
第二个参数是临时对象,您不能将非常量引用绑定到临时对象

所以您应该将函数声明为

void Manager::createPlayer(Player& player, const Player::PlayerType& playerType)
虽然我不认为使用这个参照物有什么意义。我要声明函数更简单

void Manager::createPlayer(Player& player, Player::PlayerType playerType)

没有引用。

问题是在这个调用中

manager.createPlayer(player, Player::FORWARD);
第二个参数是临时对象,您不能将非常量引用绑定到临时对象

所以您应该将函数声明为

void Manager::createPlayer(Player& player, const Player::PlayerType& playerType)
虽然我不认为使用这个参照物有什么意义。我要声明函数更简单

void Manager::createPlayer(Player& player, Player::PlayerType playerType)


没有引用。

您的manager.cc代码错误。@RichardPennington Thx,代码现在已修复。有什么想法吗?问题是枚举是一个常量,而不是一个对象。我想你有充分的理由不更改签名?(家庭作业?)。然而,这个问题说明了我在一个更大的作业中遇到的一个问题——我在一个障碍上寻求帮助,而不是试图让别人帮我做作业。谢谢,我不是想批评你。请看下面Etienne的答案,找到解决问题的方法。这就是我所说的创建可以作为引用传递的东西的意思。manager.cc的代码是错误的。@RichardPennington-Thx,代码现在已修复。有什么想法吗?问题是枚举是一个常量,而不是一个对象。我想你有充分的理由不更改签名?(家庭作业?)。然而,这个问题说明了我在一个更大的作业中遇到的一个问题——我在一个障碍上寻求帮助,而不是试图让别人帮我做作业。谢谢,我不是想批评你。请看下面Etienne的答案,找到解决问题的方法。这就是我所说的创建一些可以作为参考的东西的意思。不幸的是,他无法更改它。Thx gerrit。理查德是对的,我不能更改签名。看来我对艾蒂安的回答已经半途而废了。有人知道我给Etienne的后续问题的答案吗?不幸的是,他无法改变。Thx gerrit。理查德是对的,我不能更改签名。看来我对艾蒂安的回答已经半途而废了。有人知道我给艾蒂安的后续问题的答案吗?就是这样!快速跟进问题,要使其工作,我必须将createPlayer中的参数更改为
Player::PlayerType&
——如何使其仅与
PlayerType&
一起工作?您可以将PlayerType枚举声明移到Player之外。您可以将枚举定义移到Player类之外。我尝试将“枚举”行移到“类播放器”之上{”,并将所有Player::PlayerType更改为“PlayerType”。但在Main.cc中,行“PlayerType t=PlayerType::FORWARD”给出了编译器错误:“PlayerType”不是类或命名空间--有什么想法吗?编译器是对的,PlayerType不是类或命名空间。如果您没有限定名称怎么办?就是这样!快速跟进问题,要使其工作,我必须将createPlayer中的参数更改为
PlayerType::PlayerType&
--如何使其仅使用
PlayerType&
?您可以移动PlayerType enum声明您可以将枚举定义移出播放器类。我尝试将“枚举”行移到“类Player{”上方,并将所有Player::PlayerType更改为“PlayerType”。但在Main.cc中,行“PlayerType t=PlayerType::FORWARD”给出编译器错误:“'PlayerType'不是类或命名空间”--有什么想法吗?编译器是对的,PlayerType不是类或命名空间。如果您没有限定名称,该怎么办?Thx,但我无法更改签名。Thx,但我无法更改签名。