指针和类的交互

时间:2014-03-11 23:54:06

标签: c++

好的,我在使用指针和类时遇到了一些问题。

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

如何通过一些指针来存储播放器列表中的播放器?

2 个答案:

答案 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;
}