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