0

私のプログラムは、8 人がお互いに投票するループを 6 回繰り返すものです。各反復中に各人が誰に投票するかは、プライベート クラス メンバーvoteList(ポインターのベクトル) に保存されます。

GetVote(int)問題は、6 回の繰り返しの最後に、たとえば、私が書いたパブリック メソッドを使用して、各投票中にアンナが誰に投票したかを言いたいことです。

*(voteList[round])アンナが特定のラウンドで投票した人の価値(人)であるべきだと思いますか?メソッドを使用するGetName()と、その人の名前の文字列を取得する必要があります。しかし、どのようにいじっても、 を呼び出すたびにプログラムがクラッシュしますGetVote()

1 つまたは複数の非常にばかげた間違いを犯したことは確かですが、何が問題なのかわかりません。任意の入力をいただければ幸いです。

#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

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 に答える