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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 31, средняя оценка - 4.97
OVERPOWER8
 Аватар для OVERPOWER8
19 / 19 / 1
Регистрация: 29.11.2009
Сообщений: 224
20.12.2009, 15:29     Как обратиться к методу класса из внешней функции? #1
Имеется простой класс 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++ Какими способами можно использовать функции класса B, как параметры функции Sub класса А?
C++ Как из другой функции обратиться к членам класса окна?
C++ Вызов метода производного класса через обращение к методу базового класса
C++ Как обратиться к свойству класса
C++ Как обратиться к члену класса
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
20.12.2009, 16:02     Как обратиться к методу класса из внешней функции? #2
доступ к методам не через "." случайно?

Добавлено через 26 секунд
Цитата Сообщение от OVERPOWER8 Посмотреть сообщение
name->GetAge();
name.GetAge();
OVERPOWER8
 Аватар для 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║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
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
 Аватар для 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║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
20.12.2009, 16:51     Как обратиться к методу класса из внешней функции? #6
давай всю, разберем)) + а где спасибо? не видно..
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2295 / 1665 / 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║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
20.12.2009, 16:57     Как обратиться к методу класса из внешней функции? #8
я старался сделать по минимуму правок, весь код мне не известен..
хотя я согласен, что это нелогично..
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2295 / 1665 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
20.12.2009, 17:00     Как обратиться к методу класса из внешней функции? #9
outoftime, извини, вопрос адресован OVERPOWER8. Просто цитату случайно с твоего поста взял.
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║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
20.12.2009, 17:03     Как обратиться к методу класса из внешней функции? #11
OVERPOWER8, а что вы вообще хотите сделать?
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2295 / 1665 / 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
 Аватар для OVERPOWER8
19 / 19 / 1
Регистрация: 29.11.2009
Сообщений: 224
20.12.2009, 17:12  [ТС]     Как обратиться к методу класса из внешней функции? #13
>> outoftime

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

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

>> CyBOSSeR
Да, попробовал, но такие программы мне не нужны.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2295 / 1665 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
20.12.2009, 17:30     Как обратиться к методу класса из внешней функции? #17
Не используй указатели только потому что их можно использовать. Использовать указатели нужно только тогда когда это действительно необходимо и без них никак.
OVERPOWER8, это не единственная проблема. С указателями ты можешь огрести по полной.
Так все же почему ты используешь указатель на int для хранения возраста?
OVERPOWER8
 Аватар для 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++
 Аватар для CyBOSSeR
2295 / 1665 / 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     Как обратиться к методу класса из внешней функции?
Еще ссылки по теме:

C++ Как обратиться к функции класса, который находится в листе?
C++ Класс: как обратиться к методу производного класса через итератор на базовый класс?
Как из DLL, в котором есть только DllGetClassObject, обратиться к методу, который должен быть в этой DLL? C++ WinAPI
C++ Передача метода класса в качестве аргумента внешней функции
Как обратиться к методу объекта? C++

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

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

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

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