【问题标题】:Copying vector and remaining the memory adress of the members复制向量并保留成员的内存地址
【发布时间】:2014-03-13 01:07:14
【问题描述】:

我尝试读入一些球队和球员的数据并更改数据。 Player 类成员具有来自 Team 类的指向球队的指针,而 Teams 有一个充满球员指针的球员列表。

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

因此,从 read-in 函数返回的 team 向量中读取数据与从 read-in 函数中创建的指针中读取数据不同。

这是类的一般结构:

#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;
}

但是如果我比较&amp;Teamvektor[0]

的地址
vector <Team> team = readin();
&team[0] 

它们是不同的。我怎样才能“保留”已存储团队的地址?

【问题讨论】:

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


    【解决方案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;
      }
      

    【讨论】:

    • 我猜这是问题所在,但不知道如何解决这个问题。通过返回一个向量 insted 进行了尝试,但这也失败了
    • 我做了更改,但现在我收到错误 C2664: 'Team::Team(const Team &)' : cannot convert argument 1 from 'Team ' to 'const Team &' \ xmemory0 它来自我发现的 v.emplace_back(team) 行。编辑:我解决了,在我的测试中将我的团队更改为 Team 团队。谢谢,现在它应该像它应该的那样工作
    • 如果出现新问题,请使用新代码和描述创建一个新问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    • 2011-12-28
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多