Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 31, средняя оценка - 4.97
OVERPOWER8
19 / 19 / 1
Регистрация: 29.11.2009
Сообщений: 224
#1

Как обратиться к методу класса из внешней функции? - C++

20.12.2009, 15:29. Просмотров 4122. Ответов 21
Метки нет (Все метки)

Имеется простой класс Employee с методами GetAge() - возвращает возраст, и SetAge(int age).
Как сделать так, чтобы работали функции DoShowInfo() и DoChangeAge(int age)

Например, вот класс:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Employee
{
    private:
        int *age;
    public:
        Employee();     ~Employee();
        
        void SetAge(int NewAge) { *age = NewAge; }
        void GetAge() const     { return *age; }
}
 
Employee::Employee()        {   age = new int(27);  }
 
Employee::~Employee()       {   delete age;     }
функции:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void DoShowInfo(Employee name)
{
    name->GetAge();
}
 
void DoChangeAge(Employee name, int NewAge)
{
    name->SetAge(NewAge)
}
 
int main()
{
    Employee* Alexander = new Employee();
    ...
    DoChangeAge(Alexander, NewAge);
    DoShowInfo(Alexander);
    ...
    delete Elexander; Alexander = 0;
    ...
}
Подскажите, как сделать так, чтобы эти функции заработали?

DoChangeAge(Alexander, NewAge);
DoShowInfo(Alexander);
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.12.2009, 15:29     Как обратиться к методу класса из внешней функции?
Посмотрите здесь:
C++ Не могу обратиться к методу класса в функции
C++ Класс: как обратиться к методу производного класса через итератор на базовый класс?
C++ Как из другой функции обратиться к членам класса окна?
C++ Как обратиться к функции класса, который находится в листе?
Как обратиться к методу объекта? C++
метод класса во внешней функции C++
C++ Передача метода класса в качестве аргумента внешней функции
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
outoftime
║XLR8║
506 / 428 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
20.12.2009, 16:02     Как обратиться к методу класса из внешней функции? #2
доступ к методам не через "." случайно?

Добавлено через 26 секунд
Цитата Сообщение от OVERPOWER8 Посмотреть сообщение
name->GetAge();
name.GetAge();
OVERPOWER8
19 / 19 / 1
Регистрация: 29.11.2009
Сообщений: 224
20.12.2009, 16:13  [ТС]     Как обратиться к методу класса из внешней функции? #3
Цитата Сообщение от outoftime Посмотреть сообщение
доступ к методам не через "." случайно?

Добавлено через 26 секунд

name.GetAge();
Так-то это так, но компилятору не нравится:
(16, 17 строки):
error: conversion from ‘Employee*’ to non-scalar type ‘Employee’ requested
outoftime
║XLR8║
506 / 428 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
20.12.2009, 16:36     Как обратиться к методу класса из внешней функции? #4
Цитата Сообщение от OVERPOWER8 Посмотреть сообщение
void GetAge() const { return *age; }
немного о своем: как вы здесь возвращаете значение?

Добавлено через 10 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
 
using namespace std;
 
class Employee
{
    private:
        int *age;
    public:                
        Employee()            {       age = new int(27);      } 
        ~Employee()           {       delete age;             }
        void SetAge(int NewAge) { *age = NewAge; }
        int GetAge()            { return *age; }
 
};
 
int DoShowInfo(Employee* name)
{
    return name->GetAge();
}
 
void DoChangeAge(Employee* name, int NewAge)
{
    name->SetAge(NewAge);
}
 
int main()
{
    int NewAge = 17;
    Employee* Alexander = new Employee();
    DoChangeAge(Alexander, NewAge);
    cout << (DoShowInfo(Alexander)) << endl;
    delete Alexander;
}
работает

Добавлено через 1 минуту
http://codepad.org/zmZ6KV6O
OVERPOWER8
19 / 19 / 1
Регистрация: 29.11.2009
Сообщений: 224
20.12.2009, 16:44  [ТС]     Как обратиться к методу класса из внешней функции? #5
Цитата Сообщение от outoftime Посмотреть сообщение
немного о своем: как вы здесь возвращаете значение?
void GetAge() const { return *age; }
Да очень просто:

int SomeAge = name.GetAge();

или

cout << name.GetAge();


Спасибо, outoftime
P. S. приведенный код - это всего лишь 3% программы.
outoftime
║XLR8║
506 / 428 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
20.12.2009, 16:51     Как обратиться к методу класса из внешней функции? #6
давай всю, разберем)) + а где спасибо? не видно..
CyBOSSeR
Эксперт C++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
20.12.2009, 16:55     Как обратиться к методу класса из внешней функции? #7
OVERPOWER8, почему
Цитата Сообщение от OVERPOWER8 Посмотреть сообщение
C++
1
int *age;
?
Чем это обосновано? Почему не
C++
1
int age;
?
И зачем нужны функции DoShowInfo, DoChangeAge, если сам класс предоставляет аналогичные операции?
outoftime
║XLR8║
506 / 428 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
20.12.2009, 16:57     Как обратиться к методу класса из внешней функции? #8
я старался сделать по минимуму правок, весь код мне не известен..
хотя я согласен, что это нелогично..
CyBOSSeR
Эксперт C++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
20.12.2009, 17:00     Как обратиться к методу класса из внешней функции? #9
outoftime, извини, вопрос адресован OVERPOWER8. Просто цитату случайно с твоего поста взял.
OVERPOWER8
19 / 19 / 1
Регистрация: 29.11.2009
Сообщений: 224
20.12.2009, 17:02  [ТС]     Как обратиться к методу класса из внешней функции? #10
>> CyBOSSeR
А почему бы и нет? (Какой вопрос, такой и ответ).

Т. к. объектов класса Employee будет много, и чтобы в любой момент можно было просмотреть информацию о них, нужно просто запустить DoShowInfo(Employee);

>> outoftime
Программа сама написана только на 10% (приблизительно).

Если интересно, вот 10% программы:

Employee.hpp:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
// Employee.hpp
 
#include <iostream>
#include <ctype.h>
#include <stdlib.h>
 
using namespace std;
 
bool CheckInt(char* str)
{
    int symbols = 0;
    int digits = 0;
    
    while(*str !=0)
    {
        symbols++;
        if(isdigit(*str++))
            digits++;
    }
    
    if(symbols==digits)
        return true;
    else
        return false;
}
 
class Employee
{
    private:
        int* age;
        int* YearsOfService;
        int* Salary;
    public:
        Employee(int initAge, int initYOS, int initSalary);
        ~Employee();
 
        void SetAge(int NewAge)         { *age = NewAge; } 
        void SetSalary(int NewSalary)   { *Salary = NewSalary; }
        void SetYOS(int NewYOS)         { *YearsOfService = NewYOS; }
 
        int GetAge() const { return *age; }
        int GetSalary() const {return *Salary; }
        int GetYOS() const { return *YearsOfService; }      
};
 
Employee::Employee(int initAge=27, int initYOS=9, int initSalary=1000)
{
    age = new int(initAge);
    Salary = new int(initSalary);
    YearsOfService = new int(initYOS);
}
 
Employee::~Employee()
{
    delete Salary;
    delete YearsOfService;
    delete age;
}

Employee.cpp:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include "Employee.hpp"
 
void DoShowInfo(Employee* name)
{
    cout << endl;
    cout << "Age: " << name->GetAge() << endl;
    cout << "Salary: " << name->GetSalary() << endl;
    cout << "Years of service: " << name->GetYOS() << endl;
}
 
void DoChangeInfo(Employee* name, What2Change)
{
    
 
void ShowMenu()
{
    cout << "***** MENU: *****" << endl;
    cout << "1: Change age" << endl;
    cout << "2: Change salary" << endl;
    cout << "3: Change years of service" << endl;
    cout << "4: Redisplay menu" << endl;
    cout << "5: View infomation" << endl;
    cout << "6: Exit" << endl;
}
 
int SelectMenu()
{
    char input[100];
    int choice;
 
    for(;;)
    {
        cout << endl << "Enter your choice:\n-> ";
        cin >> input;
 
        if(!CheckInt(input))
            cout << "Wrong input!" << endl;
        else
        {
            choice = atoi(input);
            if(choice < 1 || choice > 6)
                cout << "Wrong input!" << endl;
            else
                break;
        }
    }
    choice = atoi(input); 
    return choice;
}
 
int main()
{
    cout << endl;
    
    Employee* Power = new Employee(27, 5, 1000);
    int choice;
    
    for(;;)
    {
        ShowMenu();
        choice = SelectMenu();
        
        switch(choice)
        {
            case 1: 
                int NewAge;
                cout << endl << "Enter new age:\n-> ";
                cin >> NewAge;
                Power->SetAge(NewAge); 
                cout << endl; break;
                
            case 2:
                int NewSalary;
                cout << endl << "Enter new salary:\n-> ";
                cin >> NewSalary;
                Power->SetSalary(NewSalary); 
                cout << endl; break;
                
            case 3:
                int NewYOS;
                cout << endl << "How much years?\n-> ";
                cin >> NewYOS;
                Power->SetYOS(NewYOS); 
                cout << endl; break;
                
            case 4: cout << endl; continue;
            
            case 5: 
                DoShowInfo(Power); cout << endl; break;
            break;
            
            case 6: 
                cout << endl;
                cout << "Exiting..." << endl; return 0;
            default: 
                cout << "Wrong input" << endl;
        }
    }
 
    delete Power;
    Power = 0;
    return 0;
    
}
outoftime
║XLR8║
506 / 428 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
20.12.2009, 17:03     Как обратиться к методу класса из внешней функции? #11
OVERPOWER8, а что вы вообще хотите сделать?
CyBOSSeR
Эксперт C++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
20.12.2009, 17:10     Как обратиться к методу класса из внешней функции? #12
Цитата Сообщение от OVERPOWER8 Посмотреть сообщение
А почему бы и нет? (Какой вопрос, такой и ответ).
Вот это поробуй:
C++
1
2
3
4
5
6
Employee* empl1 = new Employee();
Employee empl2 = *empl1;
 
delete empl1;
 
std::cout << empl2.GetAge(); // Здесь программа мужественно упадет по исключению
Тогда поймешь почему нет.
OVERPOWER8
19 / 19 / 1
Регистрация: 29.11.2009
Сообщений: 224
20.12.2009, 17:12  [ТС]     Как обратиться к методу класса из внешней функции? #13
>> outoftime

Собираюсь написать программу, которая хранит информацию о сотрудниках (Имя, Зарплата, Возраст, период работы) - в отдельной файле, чтобы всегда можно было просмотреть информацию о любом сотруднике и изменить её.

Просто изучаю С++, и хочу немного попрактиковаться.
outoftime
║XLR8║
506 / 428 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
20.12.2009, 17:16     Как обратиться к методу класса из внешней функции? #14
тогда, удачи и делайте резервные копии..
CyBOSSeR
Эксперт C++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
20.12.2009, 17:25     Как обратиться к методу класса из внешней функции? #15
OVERPOWER8, ну как ты попробовал выполнить код указанный в посте #12?
OVERPOWER8
19 / 19 / 1
Регистрация: 29.11.2009
Сообщений: 224
20.12.2009, 17:27  [ТС]     Как обратиться к методу класса из внешней функции? #16
>> outoftime
Спасибо, буду иметь в виду.

>> CyBOSSeR
Да, попробовал, но такие программы мне не нужны.
CyBOSSeR
Эксперт C++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
20.12.2009, 17:30     Как обратиться к методу класса из внешней функции? #17
Не используй указатели только потому что их можно использовать. Использовать указатели нужно только тогда когда это действительно необходимо и без них никак.
OVERPOWER8, это не единственная проблема. С указателями ты можешь огрести по полной.
Так все же почему ты используешь указатель на int для хранения возраста?
OVERPOWER8
19 / 19 / 1
Регистрация: 29.11.2009
Сообщений: 224
20.12.2009, 17:39  [ТС]     Как обратиться к методу класса из внешней функции? #18
>> CyBOSSeR
У меня не только указатель для хранения возраста:

C++
1
2
3
int* age;
int* YearsOfService;
int* Salary;
Потому что в таком случае гораздо удобнее будет манипулировать значениями этих характеристик класса.
CyBOSSeR
Эксперт C++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
20.12.2009, 17:46     Как обратиться к методу класса из внешней функции? #19
Цитата Сообщение от OVERPOWER8 Посмотреть сообщение
Потому что в таком случае гораздо удобнее будет манипулировать значениями этих характеристик класса.
Поподробнее можешь объяснить, просто мне не очень понятно, чем манипуляция указателями может быть удобнее? Ведь при любом копировании, присваивании двух экземпляров Employee, они в таком случае будут разделать все члены-данные, которые являются указателями. Т.е.
C++
1
2
3
4
5
6
7
Employee employee;
 
employee.SetAge(20); // employee.age == 20
 
Employee employee2 = employee; // employee.age == 20, employee2.age == 20
 
employee2.SetAge(10); // employee.age == 10, employee2.age == 10
Ели ты конечно, не определишь конструктор копирования, и не перегрузишь оператор присваивания.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.12.2009, 17:54     Как обратиться к методу класса из внешней функции?
Еще ссылки по теме:
Как из DLL, в котором есть только DllGetClassObject, обратиться к методу, который должен быть в этой DLL? C++ WinAPI
C++ Как обратиться к члену класса
C++ Как обратиться к свойству класса
C++ Вызов метода производного класса через обращение к методу базового класса
C++ Как обратиться к компоненте формы из метода класса?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
OVERPOWER8
19 / 19 / 1
Регистрация: 29.11.2009
Сообщений: 224
20.12.2009, 17:54  [ТС]     Как обратиться к методу класса из внешней функции? #20
>> CyBOSSeR
Ладно, твоя взяла.

Просто делаю так, как МНЕ УДОБНО!, больше ничего не буду разъяснять.
Yandex
Объявления
20.12.2009, 17:54     Как обратиться к методу класса из внешней функции?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru