2013-04-23 59 views
0

我的程序是一个循环的6次迭代,其中有8个人互相投票。每个人在每次迭代期间投票的人都保存到私人班级成员voteList(一个指针向量)。指向对象的指针的私有向量。如何使用getter方法访问这些对象?

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

*(voteList[round])应该是Anna在给定回合投票的价值(一个人),我想呢?并且使用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; 
} 
+0

afaik std :: vector将分配堆上的对象,所以分配内存来存储指向另一个堆空间的指针是没有意义的。但无论如何...你的'GetVote(int)'成员需要一个检查,如果'round'小于或等于'voteList'对象的数量。其余部分由Nbr44解释;) – Zaiborg 2013-04-23 06:28:42

回答

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

啊,这个工作很好,谢谢!我甚至没有意识到我在抄袭我的物品。你可能会说,我对此很新颖。 :( – user1814179 2013-04-23 06:39:57

1
void Voting (vector<Person> voters) 

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

void Voting (vector<Person> &voters) 

其实这是不完全的问题,虽然这仍然与引用。 您正在通过复制原始vector,这意味着原始vector(在main函数中)不会被函数的操作修改(当然,它的内容也是如此)。所以,所有Person里面都有它们的原始状态,其中有一个空的voteListvector。 显然,如果你试图对其中任何(不存在的)元素进行解引用,那就不太好了!

+0

我重写了所有内容,以便它指的是原件而不是副本,它的功能就像一个魅力。谢谢! – user1814179 2013-04-23 06:41:35

3

当您致电voting时,您将向量传递一个副本,并且内容也将被复制。

你应该通过这个载体作为参考:

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

您可能还需要添加一些安全检查中GetVote以确保调用方没有出界提供索引。

+0

谢谢!这是缺乏参考,除其他外。并且请安全检查,现在就开始工作。 – user1814179 2013-04-23 06:40:26

相关问题