2015-11-30 2 views
1

Я делаю вопросы о большом выпуске Big C++ 2nd edition, и я занимаюсь классами, я застрял на вопросе. В основном у меня есть классы, называемые «человек», а один называется «Pemployee», мне нужно написать функции-члены «Pemployee».Как получить личные данные из функций-членов? C++

Они дали мне декларации, необходимые для реализации определений.

Что я не могу сделать, это написать имя вызова, так как ему нужно вызвать приватную переменную «person_data», которая является объектом-человеком, я не могу получить доступ к имени строки напрямую, кроме функции-члена «person» имеет функцию get_name, которая возвращает void, я не понимаю, как вернуть строку, если я не могу вернуться из другого определения.

Вот два класса.

class Person 
{ 
public: 
    Person(); 
    Person(string pname, int page); 
    void get_name() const; 
    void get_age() const; //returns void 
private: 
    string name; 
    int age; // 0 if unknown 
}; 

class PEmployee 
{ 
public: 
    PEmployee(); 
    PEmployee(string employee_name, double initial_salary); 
    void set_salary(double new_salary); 
    double get_salary() const; 
    string get_name() const; //assuming I need to call person get_name 
private: 
    Person person_data; 
    double salary; 
}; 

Итак, еще раз, как я называю «Pemployee» get_name вернуть имя строки из person_data частной переменной

+0

Основываясь на приведенном вами образце кода, невозможно получить 'Person :: name' извне класса (без обмана, например, с использованием глобальных переменных). –

+0

Это не имеет большого смысла, когда геттеры недействительны. get_name должно возвращать строку и get_age, int. Изменив это, вы должны просто вызвать имя пользователя get_name в PEmployee get_name – rcmgleite

+0

Вот почему я не получил его, если get_name в объекте «person» вернул строку, я мог бы вызвать функцию-член этого, но это не значит, поэтому я смущенный, я не уверен, что я не понимаю какой-то принцип или если его опечатка в книге ... – user2076774

ответ

1

Опечатка в книге, Person::get_name должна возвращать строковые

0

много книги программирования учат вас добавлять методы get и set к вашим классам, когда переменная должна быть прочитана или изменена вне класса.

Вам необходимо создать методы получения для каждой из частных переменных, которые вы хотите получить доступ за пределами класса.

Вам понадобятся методы набора, если вы хотите изменить значения вне класса.

Пример получить метод для класса std::string get_name() const {return this->name;}

0

Эти подписи в классе под названием Person бессмысленны:

void get_name() const; 
void get_age() const; 

Весьма вероятно, что это опечатка. Если он вернет строку, то это не будет бессмысленным.

Однако, если вы не хотели бы менять подпись функции или добавлять нового пользователя в Лицо, вы должны объявить PEmployee как друга Лица, поэтому функции члена PEmployee могут попасть в частные и защищенные члены Person. Ниже вы можете увидеть, как это сделать.

#include <string> 

class PEmployee; 

class Person 
{ 
public: 
    friend PEmployee; 
    Person(){ } 
    Person(std::string pname, int page); 
    void get_name() const; 
    void get_age() const; //returns void 
private: 
    std::string name; 
    int age; // 0 if unknown 
}; 

class PEmployee 
{ 
public: 
    PEmployee(); 
    PEmployee(std::string employee_name, double initial_salary); 
    void set_salary(double new_salary); 
    double get_salary() const; 
    std::string get_name() const; //assuming I need to call person get_name 
private: 
    Person person_data; 
    double salary; 
};