指向对象的指针私有向量。如何使用getter方法访问这些对象?

时间:2013-04-23 06:19:16

标签: c++ pointers methods vector getter

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

我的麻烦在于,在六次迭代结​​束时,我希望能够说出,例如,安娜在每次投票中投票使用我写的GetVote(int)公共方法。

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

3 个答案:

答案 0 :(得分:3)

当您致电voting时,您传递了矢量的副本,并且内容也会被复制。

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

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

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

答案 1 :(得分: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;
}

答案 2 :(得分:1)

void Voting (vector<Person> voters)

您想将此作为参考。否则,当你得到voters[number]的地址时,你得到你的函数的局部变量的地址 - 一旦你试图实际使用它,一切都会变成香蕉。

void Voting (vector<Person> &voters)

实际上这不是问题,尽管这仍然与引用有关。 您正在通过副本传递原始vector,这意味着原始vector(在main函数中)不会被函数的操作修改(其内容也是如此)课程)。因此,内部的所有Person都具有原始状态,空voteList vector。 显然,如果你试图取消引用它的任何(不存在的)元素,那就不顺利了!