C++ 指针和类的交互

C++ 指针和类的交互,c++,C++,好的,我对指针和类有一些问题 Player1被创建并存储到team1的playerlist中,这很有效(这是我在上一篇文章中提出的问题) 但现在我有一个新的和不同的问题。 我想在playerclass的set_playername函数的帮助下设置player1的名称。但我不知道如何在玩家列表中处理它。playerlist[0]不起作用,它似乎是一个**Player对象(这是编译器在某个时候告诉我的) 在代码中,你可以看到我试图从玩家列表中找出一些东西,但我得到的只是一些神秘的符号 #includ

好的,我对指针和类有一些问题

Player1被创建并存储到team1的playerlist中,这很有效(这是我在上一篇文章中提出的问题)

但现在我有一个新的和不同的问题。 我想在playerclass的set_playername函数的帮助下设置player1的名称。但我不知道如何在玩家列表中处理它。playerlist[0]不起作用,它似乎是一个**Player对象(这是编译器在某个时候告诉我的)

在代码中,你可以看到我试图从玩家列表中找出一些东西,但我得到的只是一些神秘的符号

#include <vector>
#include <iostream>

class Player;
class Trainer;
class Team {
    Trainer* trainer_;
    std::vector<Player*> player_;
public:
    std::vector<Player*> player() { return player_; }
    Trainer* trainer() { return trainer_; }

    std::vector<Player*> get_playerlist(){
        return player_;
    }
    void addPlayer(Player* x){
        player_.emplace_back(x);

    }

};

class Player {
public: 

    void setteam_(Team* x){
        team_ = x;
        x->addPlayer(this);
    }
    void setname_(std::string x){
        name_ = x;
    }
    std::string getname_(){
        return name_;
    }
    private:
    Team* team_;
    std::string name_;
};


class Trainer {
    Team* Team_;
};
int main()
{
    Player player1;
    Team team1;
    std::vector<Player*> playerlist;
    player1.setteam_(&team1);
    playerlist = team1.get_playerlist();
    std::string a=(*playerlist[0]).getname_();
    printf("%s", a);
    std::cin.get();
    return 0;
}
#包括
#包括
班级运动员;
班主任;
班队{
培训师*培训师;
向量播放器;
公众:
std::vector player(){return player_;}
Trainer*Trainer(){返回Trainer_;}
std::vector get_playerlist(){
返回玩家;
}
无效添加玩家(玩家*x){
玩家后置(x);
}
};
职业选手{
公众:
void settam_ux(团队*x){
团队_ux=x;
x->addPlayer(这个);
}
void setname(std::string x){
名称=x;
}
std::string getname_uz(){
返回名称;
}
私人:
团队*团队;;
std::字符串名称;
};
班主任{
团队*团队;;
};
int main()
{
玩家1;
团队1;
向量播放列表;
球员1.塞塔姆(球队1);
playerlist=team1.get_playerlist();
std::string a=(*playerlist[0]).getname_u2;;
printf(“%s”,a);
std::cin.get();
返回0;
}

如何通过一些指针处理存储在playerlist中的玩家

如果要使用
播放器,必须设置其名称:

class Team {
    Trainer* trainer_;
    std::vector<Player*> player_;
public:
    std::vector<Player*>& player() { return player_; }
                        ^
                        // no copy
    Trainer* trainer() { return trainer_; }
    std::vector<Player*>& get_playerlist(){
                        ^
                        // no copy
        return player_;
    }
    void addPlayer(Player* x){
        player_.push_back(x);

    }

};
打印姓名

printf
不是类型安全的,因为它使用C意义上的变量参数
printf
没有用于
std::string
的选项,只有
C
样式的字符串。使用其他东西代替它所期望的是未定义的行为

intmain()
{
玩家1;
团队1;
player1.setname(std::string(“player1”);
^ // !
球员1.塞塔姆(球队1);
std::vector&playerlist=team1.get_playerlist();
^//没有副本
Player*pp=playerlist[0];
std::string s=pp->getname_u2;;

std::cout此问题的原因:

在代码中,你可以看到我试图从玩家列表中找出一些东西,但我得到的只是一些神秘的符号

#include <vector>
#include <iostream>

class Player;
class Trainer;
class Team {
    Trainer* trainer_;
    std::vector<Player*> player_;
public:
    std::vector<Player*> player() { return player_; }
    Trainer* trainer() { return trainer_; }

    std::vector<Player*> get_playerlist(){
        return player_;
    }
    void addPlayer(Player* x){
        player_.emplace_back(x);

    }

};

class Player {
public: 

    void setteam_(Team* x){
        team_ = x;
        x->addPlayer(this);
    }
    void setname_(std::string x){
        name_ = x;
    }
    std::string getname_(){
        return name_;
    }
    private:
    Team* team_;
    std::string name_;
};


class Trainer {
    Team* Team_;
};
int main()
{
    Player player1;
    Team team1;
    std::vector<Player*> playerlist;
    player1.setteam_(&team1);
    playerlist = team1.get_playerlist();
    std::string a=(*playerlist[0]).getname_();
    printf("%s", a);
    std::cin.get();
    return 0;
}
以下代码是错误的:

std::string a=(*playerlist[0]).getname_();
printf("%s", a);
printf
是一个varargs函数,其中第二个(以及后续)参数的类型在运行时根据格式字符串确定。通过传递它
%s”
您说下一个参数将是
char*
,但您传递的是
std::string
。这是“坏的”

您可以从字符串中提取
char*
,并将其传递给
printf
,如下所示:

std::string a=(*playerlist[0]).getname_();
printf("%s", a.c_str());

或使用C++打印函数代替:

std::string a=(*playerlist[0]).getname_();
std::cout<<a;


可能重复的问题不完全相同,但属于这个主题,是的。我认为新的问题应该在新的帖子中提出?你知道你没有设置玩家的名字吗?是的,我想在之后通过使用set_name函数在playerlist中向玩家发送地址来设置名字,但不知道如何做否我知道你为什么要这样做,但这是你想要的代码:playerlist[0]->setname_uu(“name”);thx我用一个额外的printf(“%s”,s)将它插入到我的代码中,但输出仍然是疯狂的符号,而不是预期的“player1”@jimbo999 printf(“%s”,s.c_str());但是你应该用printf来打印字符,coutnice-answer,真的帮了我很大的忙,让我明白我做错了什么!@jimbo999主要的错误是你根本没有初始化玩家的名字是的,我以前在代码中有过这个名字,但在玩了一些游戏并删除了一些行之后,我不知何故也删除了这一行。
std::string a=(*playerlist[0]).getname_();
printf("%s", a.c_str());
std::string a=(*playerlist[0]).getname_();
std::cout<<a;
std::string a=(*playerlist[0]).getname_();
printf("%s\n", a.c_str());
std::string a=(*playerlist[0]).getname_();
std::cout<<a<<std::endl;
playerlist[0]->setname_("name");
(*playerlist[0]).setname_("name");