在这个简单的示例中,我如何通过参考来传递枚举

How do I pass an enum by reference in this simple example?

本文关键字:参考 何通过 枚举 简单      更新时间:2023-10-16

我在代码中遇到问题,我砍了这个简单的示例来说明它。

我有一个具有公共枚举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参考。