2017-01-23 3 views
1

Вероятно, очень простой вопрос, но у меня есть чертовски время, выясняя это. У меня есть базовый класс:C++ Полученный класс Доступ к члену базового класса

class User 
{ 
    public: 
     User(); 
     ~User(); 
     void GetUser(); 
     void SetUser(); 
    protected: 
     std::string name; 
}; 

Вот мой производный класс:

class UserInfo: public User 
{ 
    public: 
    void GetUser(); 
}; 

И методы:

User::User() 
{ 
    name = ""; 
} 

void User::GetUser() 
{ 
    cout << name; 
} 

void User::SetUser() 
{ 
    cin >> name; 
} 

User::~User() 
{ 
    name = ""; 
} 

void UserInfo::GetUser() 
{ 
    cout << " "; 
    User::GetUser(); 
    cout << ", you entered: "; 
} 

Все, кажется, работает хорошо, но когда я называю USERINFO :: GetUser() из программы, он не выполняет или не извлекает значение, хранящееся в члене имени класса User. Как получить эту ценность? Благодарю.

+1

Нет ничего явно неправильного в коде, который показан (ну, ничего, что непосредственно имеет отношение к заявленному вопросу). Поэтому проблема должна быть в коде, который не показан. –

+1

Показать код, который вызывает GetUser(). Возможно, вам нужен 'virtual void GetUser();' вместо 'void GetUser();' в классе 'User'. – drescherjm

+2

[Работает для меня] (http://rextester.com/PUMIM54797) –

ответ

3

Ваши имена функций и то, что они делают, могут быть улучшены. Не смешивайте получение и установление переменных-членов с помощью cin или cout. Я предлагаю изменить функции следующим образом.

class User 
{ 
    public: 
     User(); 
     ~User(); 

     // Make the Get function a const member function. 
     // Return the name. 
     std::string const& GetName() const; 

     // Take the new name as input. 
     // Set the name to the new name. 
     void SetName(std::string const& newName); 

    protected: 
     std::string name; 
}; 

и реализовать их как:

std::string const& User::GetName() const 
{ 
    return name; 
} 

void User::SetName(std::string const& newName) 
{ 
    name = newName; 
} 

После этого, вам не нужна функция GetUser члена в UserInfo.

Когда вы будете готовы установить имя User, использование:

User u; 
std::string name; 
std::cin >> name; 
u.SetName(name); 

Это позволяет отделить настройку имени User, откуда вы получаете это имя от.

Когда вы будете готовы печатать имя на User, использование:

std::cout << u.GetName(); 

Это позволяет отделить получение от имени User от того, как вы используете имя после того, как вы его получите.