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