在这个简单的示例中,我如何通过参考来传递枚举
How do I pass an enum by reference in this simple example?
我在代码中遇到问题,我砍了这个简单的示例来说明它。
我有一个具有公共枚举PlayerType的玩家类。我有一个带有createplayer方法的经理类,该方法接受对玩家和玩家类型的引用。
,但我无法使其编译 - 请注意,我无法更改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.h
#ifndef MANAGER_H
#define MANAGER_H
using namespace std;
#include "Player.h"
class Manager {
public:
void createPlayer(Player& player, PlayerType& playerType);
};
#endif
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;
}
main.cc
#include <iostream>
using namespace std;
#include "Player.h"
#include "Manager.h"
int main() {
Manager manager;
Player player;
manager.createPlayer(player, Player::FORWARD);
return 0;
}
当我编译gcc -o a.out *.cc *.h
时,我会收到此错误:
In file included from Main.cc:6:0:
Manager.h:10:39: error: ‘PlayerType’ has not been declared
Main.cc: In function ‘int main()’:
Main.cc:12:47: error: no matching function for call to ‘Manager::createPlayer(Player&, Player::PlayerType)’
Main.cc:12:47: note: candidate is:
Manager.h:10:10: note: void Manager::createPlayer(Player&, int&)
Manager.h:10:10: note: no known conversion for argument 2 from ‘Player::PlayerType’ to ‘int&’
In file included from Manager.cc:7:0:
Manager.h:10:39: error: ‘PlayerType’ has not been declared
Manager.cc:9:44: error: ‘PlayerType’ has not been declared
Manager.h:10:39: error: ‘PlayerType’ has not been declared
我该怎么做才能完成这项工作?
才能使用您需要将值存储到变量中所需的参考。
int main() {
Manager manager;
Player player;
Player::PlayerType t = Player::FORWARD;
manager.createPlayer(player,t);
return 0;
}
您需要更改
void createPlayer(Player& player, Player::PlayerType& playerType);
to
void createPlayer(Player& player, const Player::PlayerType& playerType);
传递player ::作为参数转发创建一个临时的playerType值,该值只能通过const引用或通过值传递。
问题是在此呼叫中
manager.createPlayer(player, Player::FORWARD);
第二个参数是临时对象,您不得用临时对象绑定非const引用。
因此,您应该将函数声明为
void Manager::createPlayer(Player& player, const Player::PlayerType& playerType)
尽管我看不到使用参考的意义。我会声明该功能更简单
void Manager::createPlayer(Player& player, Player::PlayerType playerType)
withou参考。
相关文章:
- 在决定是通过参考还是通过价值时,尺寸真的是一个问题吗
- 通过参考变差函数传递N-D数组
- 函数参数绑定通过参考与传递指针传递数组的规则
- C 标准:通过复制返回以初始化无RVO的参考:是否有任何副本
- 是否可以通过引用通过参数返回参考
- 函数采用原始指针试图通过错误msg中概述的参考来接受指针
- 通过容器进行迭代 - 何时使用参考以及何时不使用
- 如何通过参考传递向量的静态向量
- 如何使对象通过RVALUE参考通过而没有复制
- 通过C 中的参考返回结果
- 超载函数既不按值,也不是通过参考来对象,而是将撤销的指针换成对象
- 通过参考返回C 中的对象
- 通过参考通过参考
- C 通过参考返回本地对象
- 如何通过参考构建向量的子句法
- 当通过函数中的参考调用时,标识符不确定
- Eclipse CDT不确定的参考(通过mysys2下载的软件包)
- 是否有一种方法可以始终通过值(制作副本)而不是在使用类成员函数时通过参考来传递
- 通过方法返回的重新选择参考
- 通过参考符号通过