std :: string'没有名为'get_name'的成员

时间:2015-05-08 20:15:52

标签: c++

我一直收到这个错误,

  error: ‘std::string’ has no member named ‘get_name’
       cout << name.get_name() << name.get_won() << name.get_lost << endl << endl;

即使'name = name_of_player;'和'cout&lt;&lt;名称;'打印正确的名称。我猜它是采取变量而不是实际的字符串?我不完全确定,因此我需要帮助。

#include <iostream>
#include <string>

using namespace std;

class person {

   string name_;
   int won_;
   int lost_;

   public:
   void set_name(string);
   void set_wl(int,int);
   int get_won() const {return won_;}
   int get_lost() const { return lost_;}
   string get_name() const {return name_;}
};

void person :: set_name(string n) {
   name_ = n;
}

void person :: set_wl(int x, int y) {
   won_ = x; lost_ = y;
}

int number_of_players;
string name;
string name_of_player[31];
int counter;

void get_player()
{
   counter = 1; //Initiating the counter
   cout << endl << "Ok! Now we are going to enter their names in. " << endl;
   for (int i=1; number_of_players >= i; i++)
   {
      cout << "Enter player #" << counter << "'s name... " << endl;
      cout << "The max is 30 players... " << endl;
      getline (cin, name);
      cout << endl;
      cout << "Okay, so player #" << counter << " is " << name << "." << endl;
      cout << "Please press Enter to continue..." << endl;
      cin.ignore();
      name_of_player[counter] = name;
      person name;
      name.set_name(name_of_player[counter]);
      name.set_wl(0,0);
      counter = (counter + 1);
   }

}

void list_players()
{
   counter = 1; //initiating the counter
   cout << "Here are the current players with their respective win/loss ration... " << endl << endl;
   for (int i=1; number_of_players >= i; i++)
   {
      name = name_of_player[counter];
      cout << name.get_name() << name.get_won() << name.get_lost << endl << endl;

      counter = counter +1;
   }
}

int main()
{
   cout << "Welcome to the Chess Tournament Organizer. " << endl;
   cout << "How many people will be playing today? " << endl;
   cin >> number_of_players;
   cin.ignore();
   get_player();
   list_players();
   return (0);
} 

*************** *********

编辑:我已经解决了它并且弄明白了,经过我所有可怕的代码。问题是,对于每个名字,我都在创建一个具有该名称的“人”类。但这很糟糕,因为它是一个局部范围。所以我所做的是将全局字符串'name_of_players'更改为人类的全局变量

person name_of_player[31];

也改变......

cout << "Enter player #" << counter << "'s name... " << endl;
    cout << "The max is 30 players... " << endl;
    getline (cin, name);
    cout << endl;
    cout << "Okay, so player #" << counter << " is " << name << "." << endl;
    cout << "Please press Enter to continue..." << endl;
    cin.ignore();
    name_of_player[counter].set_name(name);
    name_of_player[counter].set_wl(0,0);

对'list_of_players'函数执行相同的操作。

我仍然不完全确定为什么它不起作用,我想要通过使用给定名称创建的几个'人名'。因此,如果用户输入“mike”,则会有一个名为mike的人类,我可以通过输入mike.get_info()来找到人类mike的信息;

TL; DR 我需要修复范围,而不是将我的字符串作为每个人的人员类的名称运行。

3 个答案:

答案 0 :(得分:3)

name_of_player被定义为31 string s:

的数组
string name_of_player[31];

当您执行以下操作时,您将从counter枚举的数组中获取元素:

name = name_of_player[counter]; 

所以namestringstring没有get_name方法。

您可能会对name导致您在person name中定义本地get_player的原因感到困惑,但之后您永远不会使用本地定义的name

解决这个问题的一个丑陋方法是创建另一个全局,将name_of_player声明为:

person stats_of_player[31];

然后在forget_player - 循环的底部,您可以将本地声明的变量分配给全局数组:

stats_of_player[counter] = name;

然后,您可以使用stats_of_player中的list_players代替for - 循环,如下所示:

for (int i=1; number_of_players >= i; i++)
{
    cout << stats_of_player[i].get_name() << stats_of_player[i].get_won() << stats_of_player[i].get_lost() << endl << endl;
}

答案 1 :(得分:0)

name_of_player是字符串数组,而不是人物对象。所以你试图在字符串对象上调用get_name,这就是你得到这样的错误的原因。

答案 2 :(得分:0)

运行你的代码我得到的是std :: string没有名为get_name,get_won或get_lost的成员。这是因为您尝试在c ++字符串对象上调用这些方法,该对象没有这些方法。

此外,当你实际上是一个字符串数组时,你似乎期望name_of_player是一个玩家数组。

因为你的person类的方法是公共的而不是静态的,你需要一个person类的实例来调用这些方法(在类定义之外,例如main)。

void get_player() {
  ....
  player p();
  p.set_name("Bob");
  p.get_name();
  ...
}