Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++

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

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

20.12.2009, 15:29. Просмотров 4668. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.12.2009, 15:29
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как обратиться к методу класса из внешней функции? (C++):

Как обратиться к функции динамически созданного компонента? - C++ Builder
Динамически создаю кнопку: TButton *button = new TButton(this); button->Parent = this; button->Name = "but1"; ...

Как обратиться к переменной, объявленной внутри функции? - C++ Builder
Есть вот такой код: void __fastcall TForm1::FormCreate(TObject *Sender) { ...

Обратиться к элементам класса в методе ButtonClick - C++ Builder
Здравствуйте. Есть класс class Elem{ public: int a; }; и метод void __fastcall TForm1::Button1Click(TObject *Sender) Мне...

Переменные из функции класса в функцию другого класса - C++ Builder
Подскажи пожалуйста,как с класса Convector передать в класс Filter одержанный Bitmap и переменные? Convector::Convector() { ...

Обратиться к CDocument из дочернего класса - Visual C++
Где лучше создавать дочерние окна, производные от CView ? Пробовал в WM_CREATE, но тогда не получается из них обратиться к CDocument: ...

Из подключенного класса обратиться к форме. - Visual C++
Здравствуйте! Пишу на MS Visual C++ 2008 Express. Я подключил свой класс к программе отдельным файлом и теперь мне надо, чтобы по ходу...

21
outoftime
║XLR8║
755 / 655 / 88
Регистрация: 25.07.2009
Сообщений: 3,289
Записей в блоге: 5
20.12.2009, 16:02 #2
доступ к методам не через "." случайно?

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

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

Просто изучаю С++, и хочу немного попрактиковаться.
0
outoftime
║XLR8║
755 / 655 / 88
Регистрация: 25.07.2009
Сообщений: 3,289
Записей в блоге: 5
20.12.2009, 17:16 #14
тогда, удачи и делайте резервные копии..
0
CyBOSSeR
Эксперт С++
2309 / 1682 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
20.12.2009, 17:25 #15
OVERPOWER8, ну как ты попробовал выполнить код указанный в посте #12?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.12.2009, 17:25
Привет! Вот еще темы с ответами:

Конфликт вызванный перехватом API-функции по методу code injection - Visual C++
У меня есть приложение написанное на MS Visual C++ 6. У одного из клиентов (японская WinXP) оно падает сразу после запуска. Изучение crash...

Как из DLL, в котором есть только DllGetClassObject, обратиться к методу, который должен быть в этой DLL? - C++ WinAPI
Есть метод ITaskbarList3::SetProgressState, он предназначен для того, чтобы в значке программы рисовать прогресс, как например хром рисует,...

Обратиться к конструктору дочернего класса в интерфейсе родительского - C++ WinAPI
Есть заголовочный файл FirstDlg.h с интерфейсом класса FirstDlg унаследованного от CDialog; Хочу в интерфейсе класса(заголовочном файле)...

WM_PAINT из внешней функции - C++ WinAPI
как поставить в очередь WM_PAINT из функции вне функции обратного вызова Добавлено через 5 минут делаю так не выходит ...


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

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

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