复制向量并保留成员的内存地址

时间:2014-03-13 01:07:14

标签: c++ pointers vector stl pass-by-value

我尝试阅读团队和玩家的一些数据并更改数据。 Player类成员指向Team类中的团队,而团队中有一个玩家列表,其中包含指向玩家的指针。

问题来自readin() - 函数,它从txt.file中读取团队和播放器数据并返回团队矢量。在readin-process之后,readin-process中创建的指针似乎指向错误的地址。

因此,从读入函数返回的团队向量中读取数据与从读入函数中创建的指针读取数据不同。

以下是类的一般结构:

#include <iostream>
#include <vector>
#include <string>

class Player;
class Team
{
public:
    std::vector<Player*> getplayerlist(){
        return playerlist;
    }
    void setteamname(std::string x){
        teamname = x;
    }
    std::string getteamname(){
        return teamname;
    }
    void Team::addPlayer(Player* x){
        playerlist.emplace_back(x);
    };



private:
    std::vector<Player*> playerlist;
    std::string teamname;

};

class Player
{
public:
    Team* getpteam(){
        return pteam;
    }
    void setpteam(Team* x){
        pteam = x;
    }
    void setinformation(std::string x, int y){
        name= x;
        id = y;
      }

private: 
    int id;
    std::string name;
    Team* pteam;
};

这是读入函数的结构

vector<Team> readin(){

//some readin stuff

//if the line contains the teamname

Team team;
team.setteamID_(a);
team.setteamname_(word2);
Teamvector.emplace_back(team);

//if the line contains player data
//add the player to the team created before     

Player* player = new Player();
player->setinformation_(b, word1, lname, str, &Teamvector[a-1]);
Teamvector[a-1].addPlayer(player);

return Teamvector;
}

但如果我比较&Teamvektor[0]

的地址
vector <Team> team = readin();
&team[0] 
他们是不同的。我怎样才能“保留”存储团队的地址?

1 个答案:

答案 0 :(得分:1)

您按值返回std::vector:这意味着正在复制容器,因此元素在内存中具有相同的值但不同的地址。

如何处理这个问题的方法很少。例如:

  1. 创建容器并在方法中填写:

    std::vector<Team>   v;
    
    void readin_fillVector( vector<Team>& v) {
      //..  v.push_back( team);
    }
    
  2. 传递迭代器

    void readin_fillVector( std::back_insert_iterator< std::vector<Team> > it) {
      //..  (*it)++ = team;
    }