0

我的程序是一个循环的六次迭代,其中八个人互相投票。每个人在每次迭代中投票给谁被保存到私有类成员voteList(指针向量)。

我的麻烦是,在六次迭代结​​束时,我希望能够使用GetVote(int)我编写的 public 方法说,例如,Anna 在每次投票中投票给了谁。

*(voteList[round])我认为应该是安娜在给定一轮中投票给谁的价值(一个人)?并且使用该GetName()方法应该检索该人姓名的字符串。但无论我如何摆弄它,每当我调用GetVote().

我确定我犯了一个或多个非常愚蠢的错误,但我不知道问题出在哪里。任何输入将不胜感激!

#include <iostream>
#include <vector>
#include <random>
#include <time.h>
using namespace std;

enum gender { male, female };

class Person {
    private:
        string personName;
        gender personGender;
        vector<Person *> voteList;
    public:
        // Constructors
        Person (string, gender);
        // Setters
        void Vote (Person * target) {
            voteList.push_back (target); 
        };
        // Getters
        string GetName () { return personName; };
        string GetVote (int round)
        {
            Person ugh = *(voteList[round]);
            return ugh.GetName ();
        };
};

Person::Person (string a, gender b) {
    personName = a;
    personGender = b; }

void Voting (vector<Person> voters)
{
    for (int i = 0; i < voters.size(); i++) {
        int number = (rand() % voters.size());
        Person * myTarget = &voters[number];
        voters[i].Vote (myTarget);
        cout << voters[i].GetName() << " votes for " << voters[number].GetName() << endl;
    }
    cout << endl;
}

int main()
{
    srand(time(0));

    Person Anna ("Anna", female);
    Person Baxter ("Baxter", male);
    Person Caroline ("Caroline", female);
    Person David ("David", male);
    Person Erin ("Erin", female);
    Person Frank ("Frank", male);
    Person Gemma ("Gemma", female);
    Person Hassan ("Hassan", male);

    vector<Person> theGroup;
    theGroup.push_back (Anna);
    theGroup.push_back (Baxter);
    theGroup.push_back (Caroline);
    theGroup.push_back (David);
    theGroup.push_back (Erin);
    theGroup.push_back (Frank);
    theGroup.push_back (Gemma);
    theGroup.push_back (Hassan);

    for (int n = 0, iterations = (theGroup.size() - 2); n <= iterations; n++)
        Voting (theGroup);

    cout << "ANNA VOTED FOR...";
    for (int n = 0; n <= 5; n++)
    {
        cout << "Round " << (n + 1) << ": " << Anna.GetVote(n) << '\n';
    }

    cin.ignore();
    return 0;
}
4

3 回答 3

3

当您调用时,voting您传递了向量的副本,并且内容也将被复制。

您应该将此向量作为参考传递:

void Voting (vector<Person>& voters) { ... }

您可能还想添加一些安全检查GetVote以确保调用者不会提供超出范围的索引。

于 2013-04-23T06:29:14.903 回答
2

首先,您要在Person各处复制对象。例如,将您的Person对象添加到theGroup向量时,以及再次将相同的向量传递给Voting函数时。

复制人在语义上没有任何意义。为了避免这种情况,您应该向您的Person类添加一个私有复制构造函数和赋值运算符:

private:
    Person(const Person& other);
    Person& operator=(const Person& rhs);

接下来,您将不得不更改向量以使用Person指针:

    vector<Person *> theGroup;
    theGroup.push_back (&Anna);
    theGroup.push_back (&Baxter);
    theGroup.push_back (&Caroline);
    theGroup.push_back (&David);
    theGroup.push_back (&Erin);
    theGroup.push_back (&Frank);
    theGroup.push_back (&Gemma);
    theGroup.push_back (&Hassan);

您可以使用->运算符调用指向对象的指针的方法,如下所示:

    string GetVote (int round)
    {
        Person *ugh = voteList[round];
        return ugh->GetName ();
    };

和:

void Voting (const vector<Person *>& voters)
{
    for (int i = 0; i < voters.size(); i++) {
        int number = (rand() % voters.size());
        Person *myTarget = voters[number];
        voters[i]->Vote (myTarget);
        cout << voters[i]->GetName() << " votes for " << voters[number]->GetName() << endl;
    }
    cout << endl;
}
于 2013-04-23T06:34:03.267 回答
1
void Voting (vector<Person> voters)

您想将此作为参考。否则,当您获得 的地址时voters[number],您将获得函数的局部变量的地址 - 一旦您尝试实际使用它,一切都会变得很糟糕。

void Voting (vector<Person> &voters)

实际上这并不是问题所在,尽管这仍然与参考有关。您正在通过vector副本传递您的原件,这意味着原件vector(在main函数中)不会被函数的操作修改(当然,其内容也是如此)。所以,Person里面的所有 s 都有它们的原始状态,带有一个空的voteList vector。显然,如果您尝试取消引用它的任何(不存在的)元素,那将不会顺利!

于 2013-04-23T06:28:06.040 回答