2016-12-13 5 views
-4

私がしようとしているのは、クラスオブジェクトを関数 "random"に入れることです。 ただし、クラス内の変数の事前に割り当てられた値が変更されません。なぜこうなった?私は2013年ベクトルから要素をランダムに選択するオブジェクトを持つ関数を呼び出す

#include <iostream> 
#include <string> 
#include <vector> 

using namespace std; 

int racedice; 
int genderdice; 
int namedice; 
int agedice; 


class human 
{ 
public: 
    // Assignment of variables 
    int age; 
    string name = "\"NAME UNSPECIFIED\""; 
    string race = "UNKNOWN"; 
    string gender = "UNKNOWN"; 

    void setrace(string x) 
    { 
     race = x; 
    } 
    void setgender(string x) 
    { 
     gender = x; 
    } 
    void setage(int x) 
    { 
     age = x; 
    } 
    void setname(string x) 
    { 
     name = x; 
    } 
    void info() 
    { 
     cout << "NAME: " << name << endl; 
     cout << "RACE: " << race << endl; 
     cout << "GENDER: " << gender << endl; 
     cout << "AGE: " << age << endl << endl; 
    } 
}; 

void random(human obj) 
{ 
    vector<int> agelist; 
    agelist.push_back(1); 
    agelist.push_back(2); 
    agelist.push_back(3); 
    agelist.push_back(4); 
    agelist.push_back(5); 
    agelist.push_back(6); 
    agelist.push_back(7); 
    agelist.push_back(8); 
    agelist.push_back(9); 
    agelist.push_back(10); 

    vector<string> racelist; 
    racelist.push_back("White"); 
    racelist.push_back("Black"); 
    racelist.push_back("Asian"); 
    racelist.push_back("Hispanic"); 
    racelist.push_back("European"); 
    racelist.push_back("American"); 

    vector<string> malenames; 
    malenames.push_back("Jim"); 
    malenames.push_back("Josh"); 
    malenames.push_back("Jack"); 
    malenames.push_back("Tim"); 

    vector<string> femalenames; 
    femalenames.push_back("Kimi"); 
    femalenames.push_back("Mary"); 
    femalenames.push_back("Julia"); 
    femalenames.push_back("Olivia"); 

    vector<string> genderlist; 
    genderlist.push_back("Male"); 
    genderlist.push_back("Female"); 

    genderdice = (rand() % 2); 
    racedice = (rand() % 6); 
    namedice = (rand() % 4); 
    agedice = (rand() % 10); 

    if (genderdice == 0) 
    { 
     obj.setgender(genderlist.at(genderdice)); 
     obj.setname(malenames.at(namedice)); 
    } 
    else 
    { 
     obj.setgender(genderlist.at(genderdice)); 
     obj.setname(femalenames.at(namedice)); 
    } 

    obj.setrace(racelist.at(racedice)); 
    obj.setage(agelist.at(agedice)); 
} 

int main() 
{ 
    vector<human> humanlist; 
    human *joe = new human; 
    human *mary = new human; 

    humanlist.push_back(*joe); 
    humanlist.push_back(*mary); 

    random(*joe); 
    random(*mary); 

    vector<human>::iterator it; 
    for (it = humanlist.begin(); it != humanlist.end(); it++) 
    { 
     it->info(); 
    } 

    cout << endl; 
    system("pause"); 
} 
+2

[mcve]を提供するように質問してください。 –

+0

'ベクトル agelist {1,2,3,4,5,6,7,8,9,10};(自動it = humanlist.begin(); ...'のための –

答えて

1

はしかし、それはクラス内の変数の事前割り当て値を変更するために失敗したのVisual Studioを使用しています。

パラメータobjが関数内それ上の任意の変更は、渡された引数とは何の関係もないことを意味し、値渡しされるように宣言されている。

あなたは参照渡しするためにそれを変更することができます:あなたのコードではあり

void random(human& obj) 

しているメモリリーク。タイプhumanの2つのオブジェクトはnewですが、最後にdeleteは編集されていません。より良いアプローチは、かもしれない:

vector<human> humanlist; 

humanlist.push_back(human{}); 
humanlist.push_back(human{}); 

random(humanlist[0]); 
random(humanlist[1]); 

vector<human>::iterator it; 
for (it = humanlist.begin(); it != humanlist.end(); it++) 
{ 
    it->info(); 
} 

cout << endl; 

以上簡潔:

vector<human> humanlist(2); // construct a vector with 2 default-constructed elements 

random(humanlist[0]); 
random(humanlist[1]); 

for (const auto& h : humanlist) 
{ 
    h.info(); 
} 

cout << endl; 

info()必要上記コードのconstメンバ関数として宣言される(べき)。クラスのメンバは変更されません。

void info() const 
{ 
    cout << "NAME: " << name << endl; 
    cout << "RACE: " << race << endl; 
    cout << "GENDER: " << gender << endl; 
    cout << "AGE: " << age << endl << endl; 
} 
+0

'は簡潔です! –

+1

@JackDeeth I実際にはpush_backを使用する必要がないなど、さまざまな方法でコードを改善することができ、範囲ベースのforループや 'std :: for_each'を使用することができます。 – songyuanyao

+0

それでは、push_backの中に "human {}"とは何ですか?それは何ですか?push_backの中に入れられる代替オプションはありますか? – hindstrust

関連する問題