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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 63, средняя оценка - 4.87
half-node
21 / 18 / 3
Регистрация: 12.08.2010
Сообщений: 206
14.08.2010, 15:30     Класс внутри класса - возможно ли? #1
Всем привет!
Помогите, пожалуйста, понять следующий текст задания:

Расширьте содержание класса employee /*2 объекта и 2 метода*/ из упражнения 4, включив в него класс date и перечисление etype(см. упражнение 6 главы 4). Объект класса date будет использоваться для хранения даты приема сотрудника на работу. Перечисление будет использовано для хранения статуса сотрудника: лаборант, секретарь, менеджер и т.д. Последние два поля данных должны быть закрытыми в определении класса employee, как и номер и оклад сотрудника. Вам будет необходимо разработать методы gatemploy() и putemploy(), предназначенные соответственно для ввода и отображения информации о сотруднике. Возможно, при создании методов вам понадобится ветвление switch для работы с перечисляемым типом etype. Напишите функцию main(), которая попросит пользователя ввести данные о трех сотрудниках, а затем выведет эти данные на экран.
Непонятен момент про класс date, которым нужно расширить класс employee. Возможно ли такое, чтобы класс создавался внутри класса, и если да, то я никак не смог это реализовать.
Так же непонятно,
Последние два поля данных должны быть закрытыми в определении класса employee
.
Т.е. как сделать закрытыми - это ясно, неясно о каких двух полях идет речь. Один из них enum, а вот про второй я не понял.
Помогите разобраться
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.08.2010, 15:30     Класс внутри класса - возможно ли?
Посмотрите здесь:

C++ Есть класс A и класс B, класс B вложен в класс A и вложен в него, как классу B получить доступ к переменным класса A просто по имени?
Возможно ли создание объекта шаблонного класса в функции этого класса? C++
C++ delete внутри класса для самого класса
Объект внутри класса. Напишите класс Geo, моделирующий географические координаты на поверхности Земли C++
Функция указатель на класс, определенный внутри шаблонного класса C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
14.08.2010, 15:38     Класс внутри класса - возможно ли? #2
Цитата Сообщение от half-node Посмотреть сообщение
Возможно ли такое, чтобы класс создавался внутри класса, и если да, то я никак не смог это реализовать.
Объявляешь где-нибудь класс date и создаешь объект типа date внутри класса employee.

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

Если я правильно понял, один - это enum, а другой - объект класса date.
По-моему в задании сказано, что нужно использовать именно вложенный класс, т.е. класс даты объявить внутри разрабатываемого класса. А поля, как я понял, это дата приема сотрудника и его статус.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
14.08.2010, 16:00     Класс внутри класса - возможно ли? #4
Цитата Сообщение от Mr.X Посмотреть сообщение
По-моему в задании сказано, что нужно использовать именно вложенный класс
Ну и это можно сделать
Цитата Сообщение от Mr.X Посмотреть сообщение
А поля, как я понял, это дата приема сотрудника и его статус.
Те же яйца, только в профиль
half-node
21 / 18 / 3
Регистрация: 12.08.2010
Сообщений: 206
14.08.2010, 18:23  [ТС]     Класс внутри класса - возможно ли? #5
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: Упс...точку с запятой пропустил после объявления класса..
Mr.X
Эксперт С++
 Аватар для Mr.X
2799 / 1575 / 246
Регистрация: 03.05.2010
Сообщений: 3,656
14.08.2010, 21:39     Класс внутри класса - возможно ли? #6
А где же ваше вышебурнообсуждаемое поле статуса?
half-node
21 / 18 / 3
Регистрация: 12.08.2010
Сообщений: 206
15.08.2010, 03:30  [ТС]     Класс внутри класса - возможно ли? #7
Цитата Сообщение от Mr.X Посмотреть сообщение
А где же ваше вышебурнообсуждаемое поле статуса?
C++
1
enum etype {en, me, pro, di};
малость сокращенное
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
15.08.2010, 06:08     Класс внутри класса - возможно ли? #8
half-node, ты немножко не понял. Ты только объявил внутри своего класса новую структуру даннх - перечисление. Но у твоего класса нет полей с типом этого перечисления, т.е. ты не можешь хранить информацию с ее помощью. Для этого тебе нужно объявить экземпляр этого перечисления внутри класса, к примеру, так:
C++
1
2
enum etype { en, me, pro, di };
etype type;

Не по теме:

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

easybudda
15.08.2010, 13:39
  #9

Не по теме:

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

half-node
21 / 18 / 3
Регистрация: 12.08.2010
Сообщений: 206
15.08.2010, 17:55  [ТС]     Класс внутри класса - возможно ли? #10
Все понял, спасибо!
half-node
21 / 18 / 3
Регистрация: 12.08.2010
Сообщений: 206
15.08.2010, 19:33  [ТС]     Класс внутри класса - возможно ли? #11
Объясните, пожалуйста, почему данный код не хочет адекватно работать с циклом.
Т.е. так то он работает, но после первого заполнения, начинает пропускать ввод в 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;
}
Картинка следующая:
Миниатюры
Класс внутри класса - возможно ли?  
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
15.08.2010, 19:37     Класс внутри класса - возможно ли? #12
half-node, После
C++
1
cin>>number
поставьте
C++
1
cin.get()
или
C++
1
while(getchar()!='\n');
Ну вообщем что-то, что очищает поток.
half-node
21 / 18 / 3
Регистрация: 12.08.2010
Сообщений: 206
15.08.2010, 19:46  [ТС]     Класс внутри класса - возможно ли? #13
эм..А можно поинтересоваться, почему таки не обрабатывается команда?

Нет. Не помогло, в любом случае.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
15.08.2010, 19:49     Класс внутри класса - возможно ли? #14
half-node, Тогда перед getline. Поинтересоваться можно. Потому что в буфере после cin остаются лишние символы.
half-node
21 / 18 / 3
Регистрация: 12.08.2010
Сообщений: 206
15.08.2010, 19:58  [ТС]     Класс внутри класса - возможно ли? #15
Цитата Сообщение от Lavroff Посмотреть сообщение
half-node, Тогда перед getline. Поинтересоваться можно. Потому что в буфере после cin остаются лишние символы.
Спасибо! Перед getline заработало корректно.
Только у меня возник логичный вопрос. Каким образом можно обнулять объект string конструктором?
напр: name("")?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
15.08.2010, 19:59     Класс внутри класса - возможно ли? #16
half-node, Например) Или name="";
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
15.08.2010, 20:02     Класс внутри класса - возможно ли? #17
Цитата Сообщение от 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 = "";
half-node
21 / 18 / 3
Регистрация: 12.08.2010
Сообщений: 206
15.08.2010, 20:02  [ТС]     Класс внутри класса - возможно ли? #18
Цитата Сообщение от Lavroff Посмотреть сообщение
half-node, Например) Или name="";
Кстати, это не выручает в данной ситуации. Т.е. при обнулении name без cin.get() - проблема остается. Но при cin.get() всплывает следующая проблема, при отображении "съедается" первый символ первого объекта... Я имею в виду при вызове метода putdata()
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
15.08.2010, 20:06     Класс внутри класса - возможно ли? #19
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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.08.2010, 20:12     Класс внутри класса - возможно ли?
Еще ссылки по теме:

Не создается указатель на класс внутри класса C++
BST дерево. Инициализация класса внутри класса C++
C++ Создать объект внутри класса, который может вызывать функцию этого класса

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

Или воспользуйтесь поиском по форуму:
half-node
21 / 18 / 3
Регистрация: 12.08.2010
Сообщений: 206
15.08.2010, 20:12  [ТС]     Класс внутри класса - возможно ли? #20
Спасибо большое! Это большой урок для меня с работой со строками. Хотя, мне не до конца понятно, почему съедался первый символ. Если он съедался при вызове getline, то это происходит раньше std::cin.get()... А если при вызове putdata, то вообще темный лес >_<

И если не трудно, что делает cin.get() с пустым параметром? в двух словах. Спасибо
Yandex
Объявления
15.08.2010, 20:12     Класс внутри класса - возможно ли?
Ответ Создать тему
Опции темы

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