好的,我在使用指针和类时遇到了一些问题。
Player1被创建并存储到team1的玩家列表中,这很有效(这是我在上一篇文章中提出的问题)。
但现在我遇到了一个新的不同的问题。 我想在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;
}
如何通过一些指针来存储播放器列表中的播放器?
答案 0 :(得分:1)
此问题的原因:
在代码中你看到我试图找出一些玩家列表,但我得到的只是一些神秘的符号
以下代码是坏的:
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;
在这两种情况下,您也可能需要换行:
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");
答案 1 :(得分:0)
如果要使用它,您必须设置Player
的名称:
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);
}
};
你应该使用
std::cout<<s; // s is std::string (see below)
或
printf("%s",s.c_str());
打印名称。
printf
不是类型安全的,因为它在C意义上使用变量参数。 printf
没有std::string
选项,只有C
- 样式字符串。使用其他东西代替它所期望的是未定义的行为。
int main()
{
Player player1;
Team team1;
player1.setname_( std::string("player1"));
^ // !
player1.setteam_(&team1);
std::vector<Player*>& playerlist = team1.get_playerlist();
^ // no copy
Player* pp = playerlist[0];
std::string s = pp->getname_();
std::cout<<s; // or printf("%s",s.c_str());
return 0;
}