2015-09-25 7 views
0

У меня есть класс User() с друзьями из знакомых переменных. друзья установлены в функцию addFriend() и возвращаются в функцию getFriends().Частная переменная, назначенная в функции, но не снаружи

class User 
{ 
    public: 
     User(); 
     void setName(string username); 
     void addFriend(); 
     string getFriends(); 
     string getName(); 
    private: 
     string name; 
     string friends; 
}; 

User::User() 
{ 
    friends = ","; 
} 

void User::setName(string username) 
{ 
    name = username; 
} 

void User::addFriend() 
{ 
    string friendName; 
    cout << "Enter friends name: "; //inputs "Bob" 
    cin >> friendName; 
    cout << endl; 

    friends += friendName + ","; 
    cout << getFriends() << endl; //this outputs ",Bob," 
} 

string User::getFriends() 
{ 
    return friends; 
} 

string User::getName() 
{ 
    return name; 
} 

Функция addFriend() ведет себя, как это следует в том, что, когда друг добавляется в список друзей, они отделены друг от друга запятыми. Когда я вызываю функцию getFriends() внутри функции addFriend(), она ведет себя так, как ожидалось. Однако, когда я пытаюсь вызвать user.getFriends(); Я получаю только запятую («,»).

class System 
{ 
    public: 
     System(); 
     void createUser(); 
     User& getCurrentUser(); 
     vector<User> users; 
    private: 
     User currentUser; 
}; 

System::System() {} 

void System::createUser() 
{ 
    string username; 
    bool userExists = false; 

    cout << "Please enter a user name: "; 

    cin >> username; 
    cout << endl; 

    for(int i = 0; i < users.size(); i++) 
    { 
     if(users.at(i).getName() == username) 
      userExists = true; 
    } 

    if(!userExists) 
    { 
     User temp;  //creates a temporary user stored in vector of Users 
     users.push_back(temp);  //puts new User at end of users 

     users.back().setName(username); 

     currentUser = users.back(); 
    } 

    if(userExists) 
     cout << "User already exists." << endl << endl; 
} 

User& System::getCurrentUser() 
{ 
    return currentUser; 
} 

Системный класс может вызывать другие неуказанные функции в User() без проблем.

int main() 
{ 
    System system; 
    system.createUser();     //create user named "Bill" 
    system.getCurrentUser().addFriend(); //inputs "Bob" 

    for(int i = 0; i < system.users.size(); i++) 
    { 
     string buddies = system.users.at(i).getFriends(); 
     cout << "User: " + system.users.at(i).getName(); 
     cout << " - Friends: " << buddies << endl; 
    } 
} 

Это выводит только запятую. Почему это?

Редактировать 1: Язык C++.

Редактировать 2: Я пропустил большую часть кода ради простоты на том, что, как я думал, было проблемой. Теперь я добавляю класс, его функции и его взаимодействия с User().

+0

Возможно, это зависит от того, на каком языке это. –

+2

Прекрасно работает для меня. http://ideone.com/9R2WBI – Roddy

+0

Прекрасно работает для меня. http://ideone.com/CWoNOf –

ответ

1

Потому что это: -

private: 
     User currentUser; 

currentUser не является указателем или ссылкой, это фактический user объект. Поэтому внесение изменений в него через addFriend не окажет никакого влияния на объект user в векторе.

+0

, расширяя это, вы должны избавиться от 'currentUser' и сделать' getCurrentUser' функцией do '{if (users.empty() throw std :: runtime_error (« Нет текущего пользователя »); return users.back() ;} ' –

Смежные вопросы