C++ 访问向量<;对象>;来自另一个类';方法

C++ 访问向量<;对象>;来自另一个类';方法,c++,oop,C++,Oop,我有一节玩家课和一节游戏课 My Game.cpp有一个setPlayers方法。它编译时没有错误,但当我在main中使用它时,它不起作用,反而给了我分段错误。甚至可以从另一个对象的方法访问另一个对象的向量吗? main.cpp Player.cpp int Player::getRole() { return this->role; } void Player::setRole(int newRole) { std::cout << "setting role

我有一节玩家课和一节游戏课

My Game.cpp有一个
setPlayers
方法。它编译时没有错误,但当我在main中使用它时,它不起作用,反而给了我分段错误。甚至可以从另一个对象的方法访问另一个对象的向量吗? main.cpp

Player.cpp

int Player::getRole() {
    return this->role;
}
void Player::setRole(int newRole) {
    std::cout << "setting role" << std::endl;
    this->role = role;
}

您发布的代码中有两个问题

首先,向量以零大小开始,除非构造一个非零大小的向量。创建一个没有元素的向量,然后单击此处

void Game::setPlayers(Player* player_arg, int p_position){
  players[p_position] = player_arg;
}
您可以使用
操作符[]
访问元素。注意到什么了吗?不能访问空向量中的元素。使用
push_back
在后面添加一个元素。实际上,如果你想让玩家在某些位置,那么一个
std::unordered_map
会更容易,它们可以用作“稀疏”数组,即你可以在
p_position=12
添加一个
Player
,即使这是你添加的第一个玩家

第二,

one.setPlayers(&p, p.getRole()-1);

指针
&p
始终具有相同的值。它是本地对象
Player p的地址。当您离开作用域时,该对象将被销毁,并且向量中的所有指针都将成为悬空指针。在实际需要对象容器时,将指针存储在容器中是一个常见的错误。改用
std::vector

记住,vector一开始是空的。空向量中的任何索引都将超出范围,并导致未定义的行为。请提供一个。将
&p
传递给
setPlayers
看起来是错误的,但我不认为这是当前问题的原因不要将头文件与类混淆,带有对象的类或带有编译时错误的运行时错误。@idclev463035818您能看到更新的qs吗?@Beta您能看到更新的qs吗?我正在尝试使用
std::unordered\u map playersMap但它一直给我
一个播放器上的标识符

#ifndef GAME_H
#define GAME_H

#include <vector>
#include <map>
#include <string>
#include <stddef.h>
#include <time.h>
#include <stdlib.h>

#include "shipment.h"
#include "order.h"
#include "player.h"

class Game
{

private:
  int gId;
  std::vector<Player*> players;
public:
  std::vector<Player*> getPlayers();
  void setPlayers(Player*, int);
};
#endif
void Game::setPlayers(Player* player_arg, int p_position){
  players[p_position] = player_arg;
}
void Game::setPlayers(Player* player_arg, int p_position){
  players[p_position] = player_arg;
}
one.setPlayers(&p, p.getRole()-1);