Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/141: Рейтинг темы: голосов - 141, средняя оценка - 4.86
23 / 20 / 3
Регистрация: 12.08.2010
Сообщений: 206

Класс внутри класса - возможно ли?

14.08.2010, 15:30. Показов 26490. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Помогите, пожалуйста, понять следующий текст задания:

Расширьте содержание класса employee /*2 объекта и 2 метода*/ из упражнения 4, включив в него класс date и перечисление etype(см. упражнение 6 главы 4). Объект класса date будет использоваться для хранения даты приема сотрудника на работу. Перечисление будет использовано для хранения статуса сотрудника: лаборант, секретарь, менеджер и т.д. Последние два поля данных должны быть закрытыми в определении класса employee, как и номер и оклад сотрудника. Вам будет необходимо разработать методы gatemploy() и putemploy(), предназначенные соответственно для ввода и отображения информации о сотруднике. Возможно, при создании методов вам понадобится ветвление switch для работы с перечисляемым типом etype. Напишите функцию main(), которая попросит пользователя ввести данные о трех сотрудниках, а затем выведет эти данные на экран.
Непонятен момент про класс date, которым нужно расширить класс employee. Возможно ли такое, чтобы класс создавался внутри класса, и если да, то я никак не смог это реализовать.
Так же непонятно,
Последние два поля данных должны быть закрытыми в определении класса employee
.
Т.е. как сделать закрытыми - это ясно, неясно о каких двух полях идет речь. Один из них enum, а вот про второй я не понял.
Помогите разобраться
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.08.2010, 15:30
Ответы с готовыми решениями:

Класс внутри класса
Есть 2 класса: большой -А и меньшый-Б. Класс Б есть параметром класса А. в большом классе есть процедуры использующие обекты класса Б! ...

Класс внутри класса
Добрый вечер! Имею вот что: class Outer { public: double y ; class Inner

Не создается указатель на класс внутри класса
Всем привет! У меня возникла очень интересная ситуация... У меня есть набор классов. Часть классов являются членами других классов. ...

21
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
14.08.2010, 15:38
Цитата Сообщение от half-node Посмотреть сообщение
Возможно ли такое, чтобы класс создавался внутри класса, и если да, то я никак не смог это реализовать.
Объявляешь где-нибудь класс date и создаешь объект типа date внутри класса employee.

Цитата Сообщение от half-node Посмотреть сообщение
Последние два поля данных должны быть закрытыми в определении класса employee
Если я правильно понял, один - это enum, а другой - объект класса date.
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
14.08.2010, 15:56
Цитата Сообщение от Nameless One Посмотреть сообщение
Объявляешь где-нибудь класс date и создаешь объект типа date внутри класса employee.

Если я правильно понял, один - это enum, а другой - объект класса date.
По-моему в задании сказано, что нужно использовать именно вложенный класс, т.е. класс даты объявить внутри разрабатываемого класса. А поля, как я понял, это дата приема сотрудника и его статус.
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
14.08.2010, 16:00
Цитата Сообщение от Mr.X Посмотреть сообщение
По-моему в задании сказано, что нужно использовать именно вложенный класс
Ну и это можно сделать
Цитата Сообщение от Mr.X Посмотреть сообщение
А поля, как я понял, это дата приема сотрудника и его статус.
Те же яйца, только в профиль
0
23 / 20 / 3
Регистрация: 12.08.2010
Сообщений: 206
14.08.2010, 18:23  [ТС]
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
class employee
{
private:
    class date
    {
    private:
        int day,month,year;
    public:
        date():day(0),month(0),year(0)
        {};
 
        void adddate()
        {
            char ch='a';
            cout << "Enter date dd/mm/yyyy: "; 
            cin >> day >> ch >> month >> ch >> year;
        }
 
        void showdate()
        {
            cout << day << '/' << month << '/' << year << endl;
        }
    };
    date d1;
    enum etype {en, me, pro, di};
    int num_emp;
    float salary;
public:
    employee():num_emp(0),salary(0.0)
    {};
 
    void gatemploye()
    {
        d1.adddate();
    }
 
    void putemploye()
    {
        d1.showdate();
    }
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    employee em1;
    em1.gatemploye();
    em1.putemploye();
 
    getch();
    return 0;
}
При таком коде, при компиляции возвращает:
C++
1
2
3
1>c:\c++\projects\6_6\6_6\6_6.cpp(79): error C2664: employee::employee(const employee &): невозможно преобразовать параметр 1 из "int" в "const employee &"
1>          Причина: невозможно преобразовать "int" в "const employee"
1>          Ни один конструктор не смог принять исходный тип, либо разрешение перегрузки конструктора неоднозначно
UPD: Упс...точку с запятой пропустил после объявления класса..
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
14.08.2010, 21:39
А где же ваше вышебурнообсуждаемое поле статуса?
0
23 / 20 / 3
Регистрация: 12.08.2010
Сообщений: 206
15.08.2010, 03:30  [ТС]
Цитата Сообщение от Mr.X Посмотреть сообщение
А где же ваше вышебурнообсуждаемое поле статуса?
C++
1
enum etype {en, me, pro, di};
малость сокращенное
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
15.08.2010, 06:08
half-node, ты немножко не понял. Ты только объявил внутри своего класса новую структуру даннх - перечисление. Но у твоего класса нет полей с типом этого перечисления, т.е. ты не можешь хранить информацию с ее помощью. Для этого тебе нужно объявить экземпляр этого перечисления внутри класса, к примеру, так:
C++
1
2
enum etype { en, me, pro, di };
etype type;

Не по теме:

PS. Не экономь место, используй нормальное форматирование кода и объявляй более осмысленные идентификаторы. Это облегчит жизнь и тебе, и тем, кто будет просматривать твой код.

0
15.08.2010, 13:39

Не по теме:

Цитата Сообщение от Nameless One Посмотреть сообщение
Не экономь место, используй нормальное форматирование кода и объявляй более осмысленные идентификаторы. Это облегчит жизнь и тебе, и тем, кто будет просматривать твой код.
ППКС :good:

0
23 / 20 / 3
Регистрация: 12.08.2010
Сообщений: 206
15.08.2010, 17:55  [ТС]
Все понял, спасибо!
0
23 / 20 / 3
Регистрация: 12.08.2010
Сообщений: 206
15.08.2010, 19:33  [ТС]
Объясните, пожалуйста, почему данный код не хочет адекватно работать с циклом.
Т.е. так то он работает, но после первого заполнения, начинает пропускать ввод в name.
Можно, конечно, воспользоваться cin >> name, но мне нунжо сделать так, чтобы учитывались пробелы.
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
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <string>
using namespace std;
 
class employee
{
private:
    string name;
    long number;
public:
    employee():number(0)
    {};
 
    void getdata()
    {
        cout << "Enter name: ";
        getline(cin,name);
        cout << "Enter number: ";
        cin >> number;
    }
 
    void putdata()const
    {
        cout << "Name: " << name << endl;
        cout << "Number: " << number << endl;
    }
};
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    employee emp[100];
    int n=0;
    char ch;
    do
    {
        emp[n++].getdata();
        cout << "Repeat?(y/n): "; cin >> ch;
    }while(ch!='n');
    
    for(int i=0; i<n;i++)
        emp[i].putdata();
 
    getch();
    return 0;
}
Картинка следующая:
Миниатюры
Класс внутри класса - возможно ли?  
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
15.08.2010, 19:37
half-node, После
C++
1
cin>>number
поставьте
C++
1
cin.get()
или
C++
1
while(getchar()!='\n');
Ну вообщем что-то, что очищает поток.
0
23 / 20 / 3
Регистрация: 12.08.2010
Сообщений: 206
15.08.2010, 19:46  [ТС]
эм..А можно поинтересоваться, почему таки не обрабатывается команда?

Нет. Не помогло, в любом случае.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
15.08.2010, 19:49
half-node, Тогда перед getline. Поинтересоваться можно. Потому что в буфере после cin остаются лишние символы.
1
23 / 20 / 3
Регистрация: 12.08.2010
Сообщений: 206
15.08.2010, 19:58  [ТС]
Цитата Сообщение от Lavroff Посмотреть сообщение
half-node, Тогда перед getline. Поинтересоваться можно. Потому что в буфере после cin остаются лишние символы.
Спасибо! Перед getline заработало корректно.
Только у меня возник логичный вопрос. Каким образом можно обнулять объект string конструктором?
напр: name("")?
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
15.08.2010, 19:59
half-node, Например) Или name="";
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
15.08.2010, 20:02
Цитата Сообщение от half-node Посмотреть сообщение
Каким образом можно обнулять объект string конструктором
Если обнулять при инициализации, то просто нужно вызвать конструктор по умолчанию:
C++
1
std::string name;
В противном случае вызываем метод clear:
C++
1
2
std::string name("string");
name.clear();
Для любителей садо-мазо:
C++
1
2
3
4
std::string name("string");
name = std::string();
std::string str("str");
str = "";
1
23 / 20 / 3
Регистрация: 12.08.2010
Сообщений: 206
15.08.2010, 20:02  [ТС]
Цитата Сообщение от Lavroff Посмотреть сообщение
half-node, Например) Или name="";
Кстати, это не выручает в данной ситуации. Т.е. при обнулении name без cin.get() - проблема остается. Но при cin.get() всплывает следующая проблема, при отображении "съедается" первый символ первого объекта... Я имею в виду при вызове метода putdata()
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
15.08.2010, 20:06
half-node,
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
#include <iostream>
#include <conio.h>
#include <string>
using namespace std;
 
class employee
{
private:
        string name;
        long number;
public:
        employee():number(0)
        {};
 
        void getdata()
        {
                cout << "Enter name: ";
                getline(cin,name);
                cout << "Enter number: ";
                cin >> number;
        }
 
        void putdata()const
        {
                cout << "Name: " << name << endl;
                cout << "Number: " << number << endl;
        }
};
 
 
int main()
{
        employee emp[100];
        int n=0;
        char ch;
        do
        {
                emp[n++].getdata();
                cout << "Repeat?(y/n): "; cin >> ch;
                                std::cin.get();
        }while(ch!='n');
        
        for(int i=0; i<n;i++)
                emp[i].putdata();
 
        getch();
        return 0;
}
0
23 / 20 / 3
Регистрация: 12.08.2010
Сообщений: 206
15.08.2010, 20:12  [ТС]
Спасибо большое! Это большой урок для меня с работой со строками. Хотя, мне не до конца понятно, почему съедался первый символ. Если он съедался при вызове getline, то это происходит раньше std::cin.get()... А если при вызове putdata, то вообще темный лес >_<

И если не трудно, что делает cin.get() с пустым параметром? в двух словах. Спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.08.2010, 20:12
Помогаю со студенческими работами здесь

Функция указатель на класс, определенный внутри шаблонного класса
Доброго времени суток! Помогите пожалуйста разобрать со следующим кодом: template &lt;class T&gt; class List{ class Node{ ...

Структуру переделать в класс, чтобы массив был внутри класса
есть структура struct CUSTOMER { unsigned short number; char name; char tel; ...

Класс: Почему этот operator+ не хочет работать как функция внутри класса?
#include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; class complex{ private: int re, im; public: complex(int r,...

Объект внутри класса. Напишите класс Geo, моделирующий географические координаты на поверхности Земли
Ребят, помогите решить задачу, пожалуйста. Чтт никак не получается :( Напишите класс Geo, моделирующий географические координаты на...

Класс внутри класса с доступом к данным первого класса
Есть класс, он содержит в себе функции. Функций этих много и я решил, что было бы удобно их группировать, как-нибудь через структуры или...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru