我正在尝试创建一个类向量,然后用for循环命名每个类

时间:2014-07-24 01:33:17

标签: c++ loops vector std

我很陌生。所有帮助将不胜感激。 我试图创建一个类对象的向量,然后用for循环命名每个对象。我收到错误c2679:二进制'>>'没有找到哪个操作符采用类型'重载函数'的右手操作数。在第35行.cin>> play.p_name。请帮忙。

#include <iostream>
#include <string>
#include <vector>
using namespace std;

class Player
{
private:
    string player_name;
    int score[18];
public:
    void p_name(string);
    void Player::p_name();
};

void Player::p_name(string name)
{
    player_name = name;
}

int main()
{
    int num_players = 0;
    int i = 0;
    int j = 0;

    cout << "Please enter number of players.\n";
    cin >> num_players;

    vector<Player>player_vector;
    for (int i = 0; i < num_players ; ++i)
    {
        Player play;
        player_vector.push_back(play);
        for (int j = 0; j < num_players; j++)
        {
            cout << "What is the name of Player " << j << ": ";
            cin >> play.p_name;
        }
    }
    system("PAUSE");
    return 0;
}

1 个答案:

答案 0 :(得分:3)

首先play.p_name是一个函数,而不是一个变量;你不能那样分配给它。您必须使用字符串变量作为参数来调用它。你可以这样做:

string name;
cin >> name;
play.p_name(name);

第二,您存储名称的Player对象不是向量中的对象!

执行player_vector.push_back(play)时,您将play对象的副本放入向量中。由于尚未为play指定名称,因此向量中的副本也没有名称。

稍后,您将名称存储在play中,但这不会影响存储在向量中的名称。在循环的底部,play被破坏,并为下一次迭代构造一个新的(没有名称)。因此,您在play中存储的名称就会被丢弃。

在设置播放器的名称之后,您应该将player_vector.push_back(play)行向下移动到,这样您就可以复制一个具有名称的对象,而不是那个没有名称的对象。 / p>

第三次,您不需要两个嵌套循环。提示循环中的名称只表示对于每个单独的玩家(按i计算),您将要求每个玩家的名称(按j计算) 。如果有5个玩家,则会要求用户输入25个名字。

摆脱j循环,在创建i对象后立即在play循环中询问玩家的名字。

,您的班级定义中存在语法错误:行void Player::p_name();应该只是void p_name();。您只能使用Player::限定符来引用类 outside 中的函数(例如,稍后将函数定义几行时)。在类定义中,您不必告诉编译器p_namePlayer类中,因为编译器已经知道了。

最后,您不需要在int i = 0顶部声明的int j = 0main变量。您根本没有实际使用这些变量,因为您在i循环中定义了 new jfor变量。 (当然,如上所述,您根本不需要j。)