Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.76/42: Рейтинг темы: голосов - 42, средняя оценка - 4.76
19 / 19 / 2
Регистрация: 29.11.2009
Сообщений: 224
1

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

20.12.2009, 15:29. Просмотров 8596. Ответов 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);
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.12.2009, 15:29
Ответы с готовыми решениями:

Не могу обратиться к методу класса в функции
Добрый день. При написании программы возникла проблема - в функции не могу обратиться к методу...

Как обратиться к методу текущего класса
Вообщем такая проблема. У нас есть класс в этом классе есть метод. И нам нужно в теле данного...

Как обратиться к методу из другого класса
Доброго времени суток. Продолжаю изучение C#, и вот я с вопросом. Имеются 2 класса в отдельных...

Как обратиться к методу из другого метода внутри одного и того же класса
Доброго времени суток. Продолжаю изучение C#, и вот моя третья тема (или четвертая, за сегодня) с...

21
║XLR8║
1040 / 829 / 254
Регистрация: 25.07.2009
Сообщений: 4,106
Записей в блоге: 5
20.12.2009, 16:02 2
доступ к методам не через "." случайно?

Добавлено через 26 секунд
Цитата Сообщение от OVERPOWER8 Посмотреть сообщение
name->GetAge();
name.GetAge();
1
19 / 19 / 2
Регистрация: 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
0
║XLR8║
1040 / 829 / 254
Регистрация: 25.07.2009
Сообщений: 4,106
Записей в блоге: 5
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
2
19 / 19 / 2
Регистрация: 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% программы.
0
║XLR8║
1040 / 829 / 254
Регистрация: 25.07.2009
Сообщений: 4,106
Записей в блоге: 5
20.12.2009, 16:51 6
давай всю, разберем)) + а где спасибо? не видно..
1
Эксперт С++
2327 / 1700 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
20.12.2009, 16:55 7
OVERPOWER8, почему
Цитата Сообщение от OVERPOWER8 Посмотреть сообщение
C++
1
int *age;
?
Чем это обосновано? Почему не
C++
1
int age;
?
И зачем нужны функции DoShowInfo, DoChangeAge, если сам класс предоставляет аналогичные операции?
0
║XLR8║
1040 / 829 / 254
Регистрация: 25.07.2009
Сообщений: 4,106
Записей в блоге: 5
20.12.2009, 16:57 8
я старался сделать по минимуму правок, весь код мне не известен..
хотя я согласен, что это нелогично..
0
Эксперт С++
2327 / 1700 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
20.12.2009, 17:00 9
outoftime, извини, вопрос адресован OVERPOWER8. Просто цитату случайно с твоего поста взял.
0
19 / 19 / 2
Регистрация: 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;
    
}
0
║XLR8║
1040 / 829 / 254
Регистрация: 25.07.2009
Сообщений: 4,106
Записей в блоге: 5
20.12.2009, 17:03 11
OVERPOWER8, а что вы вообще хотите сделать?
0
Эксперт С++
2327 / 1700 / 148
Регистрация: 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(); // Здесь программа мужественно упадет по исключению
Тогда поймешь почему нет.
1
19 / 19 / 2
Регистрация: 29.11.2009
Сообщений: 224
20.12.2009, 17:12  [ТС] 13
>> outoftime

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

Просто изучаю С++, и хочу немного попрактиковаться.
0
║XLR8║
1040 / 829 / 254
Регистрация: 25.07.2009
Сообщений: 4,106
Записей в блоге: 5
20.12.2009, 17:16 14
тогда, удачи и делайте резервные копии..
0
Эксперт С++
2327 / 1700 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
20.12.2009, 17:25 15
OVERPOWER8, ну как ты попробовал выполнить код указанный в посте #12?
0
19 / 19 / 2
Регистрация: 29.11.2009
Сообщений: 224
20.12.2009, 17:27  [ТС] 16
>> outoftime
Спасибо, буду иметь в виду.

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

C++
1
2
3
int* age;
int* YearsOfService;
int* Salary;
Потому что в таком случае гораздо удобнее будет манипулировать значениями этих характеристик класса.
0
Эксперт С++
2327 / 1700 / 148
Регистрация: 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
Ели ты конечно, не определишь конструктор копирования, и не перегрузишь оператор присваивания.
1
19 / 19 / 2
Регистрация: 29.11.2009
Сообщений: 224
20.12.2009, 17:54  [ТС] 20
>> CyBOSSeR
Ладно, твоя взяла.

Просто делаю так, как МНЕ УДОБНО!, больше ничего не буду разъяснять.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.12.2009, 17:54

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

Обратиться из класса к методу другого класса
Доброе время суток коллеги есть вопрос как обратиться с одного метода класса к другому Пример: ...

Класс: как обратиться к методу производного класса через итератор на базовый класс?
Есть абстрактный и два порожденных. Хочу создать например list&lt;Base*&gt; list1; затем добавляю себе...

Как обратиться к определенной функции класса
Доброе время суток. Подскажите пожалуйста как обратится к классу ? К отдельной функции. ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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