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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.93
numberone
0 / 0 / 0
Регистрация: 09.06.2012
Сообщений: 14
#1

Массив указателей на производные классы - C++

09.06.2012, 16:40. Просмотров 1935. Ответов 7
Метки нет (Все метки)

Здравствуйте,
есть базовый класс строка mystring

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class mystring    // Опишем базовый класс строки
{
protected:
    char *p;    // Указатель на char - хранит адрес динамически выделенной памяти для размещения символов строки
    int length;    // Значение типа int - хранит длину строки в байтах
public:    // Обязательные методы должны выполнять следующие действия:
    mystring();    // Конструтор без параметров
    mystring(const char *s);    // Конструктор, принимающий в качестве параметра Си-строку (заканчивается нулевым байтом)
    mystring(char c);        // Конструктор, принимающий в качестве параметра символ (char)
    mystring(const mystring &str);    // Конструктор копирования
    ~mystring();    // Деструктор
    int get_length();    // Получение длины строки
    void show();        // Временно. Для тестирования вывод строки на экран
};
и производные от него классы Строка идентификатор и комплексное число

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
// Производный от строка класс строка идентификатор (_A-Za-z0-9)
class identification: public mystring
{
public:    // Обязательные методы:
    identification();    // Конструтор без параметров
    identification(const char *s);    // Конструктор, принимающий в качестве параметра Си-строку (заканчивается нулевым байтом)
    identification(char c);        // Конструктор, принимающий в качестве параметра символ (char)
    identification(const identification &str);    // Конструктор копирования
    ~identification();    // Деструктор
    int find_char(char c);    // Поиск первого вхождения символа в строку
    identification operator+(identification id);    // Переопределим сложение  (+) - операция конкатенации строк
    identification operator=(identification id);    // Переопределим присваивание (=)
    bool operator<(identification id);                // Переопределим оператор  <   - проверка на меньше. Строка считается меньше другой,
                                                    // если код символа первой строки в i-й позиции
                                                    // (i изменяется от 0 до n-1, где n - длина более
                                                    // короткой строки) меньше кода символа в той же позиции
                                                    // кода символа в той же позиции во второй строке,
                                                    // длины строк могут не совпадать.
};
// Производный от строка класс комплексное число (+-0-9i)
class complex: public mystring
{
public:
    complex();    // Конструтор без параметров
    complex(const char *s);    // Конструктор, принимающий в качестве параметра Си-строку (заканчивается нулевым байтом)
    complex(const complex &str);    // Конструктор копирования
    ~complex();    // Деструктор
    complex operator+(complex com);        // Переопределим сложение    + - сумма чисел
    complex operator=(complex com);        // Переопределим присваивание (=)
};

Все методы для классов написал, но когда дошел до приведенных заданий заданий вообще не понимаю как это организовать

Написать тестовую программу, которая:
* динамически выделяет массив указателей на базовый класс (4-6 шт.);
* в режиме диалога заполняет этот массив указателями на производные классы,
при этом экземпляры производных классов создаются динамически с заданием
начальных значений;
* для созданных экземпляров производных классов выполняется
проверка всех разработанных методов (в соответствии с вариантом задания),
с выводом исходных данных и результатов на дисплей.
* для конструкторов копирования каждого класса предусмотреть
диагностическую печать количества его ввызовов в заданное место дисплея,
(рекомендуется использовать статические члены класса).

Режим диалога обеспечивается с помощью иерархического меню.

Не понятно даже как это в консоли реализовать, не то что с windows forms

Пожалуйста приведите фрагмент кода, если можно, спасибо

вот моя попытка первый и второй пункт реализовать


C++
1
2
3
4
5
6
7
8
mystring **pointer;
    int NumberOfElements;
    cin >> NumberOfElements;
    pointer =new mystring*[NumberOfElements];
    for(int i=0;i<NumberOfElements;i++)
    {
    *(pointer+i) = dynamic_cast<mystring*>(new identification, new complex);
    }
Но как задать номер элемента, его тип и начальное значение, я хз
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.06.2012, 16:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Массив указателей на производные классы (C++):

Массив указателей на классы - C++
Помогите, пожалуйста, понять ситуацию: enum COLOR {RED, GREEN, BLUE}; class Shape { protected: int m_x, m_y; COLOR...

Массив указателей на неродственные классы - C++
Возможно ли создать массив указателей на экземпляры классов, не имеющих общего родительского?

Классы. Наследование, массив указателей, очистка памяти - C++
Разбираюсь с классами в си++. Имеется следующий код: header.h ...... class Circle :public Figure { public: void show(); }; ...

Наследование, базовые классы и производные классы - C++
Добрый вечер.Задание: необходимо разработать поля и методы наследуемые из базового класса и собственные компоненты производных...

Классы и наследование (Создать класс 3D фигура, и производные классы шар, конус, цилиндр и куб. Создать функцию вычисления объёма.) - C++
Уважаевые, помогите написать прожку на экзамене: Создать класс 3D фигура, и производные классы шар, конус, цилиндр и куб. Создать функцию...

производные классы. - C++
Попалось такое Задание: Написать программу используя базовый и производный классы, защищенные члены класса, которая создавала массив...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
OstapBender
583 / 521 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
09.06.2012, 20:10 #2
в чем сложность-то?

C++
1
2
3
4
5
6
7
8
9
10
11
12
mysting* Factory(int choice) {
return (choice == 1) ? new identification() : new complex() ;
}
 
mystring* arr[6];
 
std::cout << "1: ident\n2: complex\n\n";
int choice;
for (int i=0; i<6; i++){
std::cin >> choice;
arr[i] = Factory(choice);
}
Добавлено через 1 минуту
Цитата Сообщение от numberone Посмотреть сообщение
начальное значение
я так понял имеется ввиду конструктор по умолчанию. либо значения которые явно не нужно вводить с клавиатуры.

Добавлено через 6 минут
Цитата Сообщение от numberone Посмотреть сообщение
для созданных экземпляров производных классов выполняется
проверка всех разработанных методов (в соответствии с вариантом задания),
с выводом исходных данных и результатов на дисплей.
тут т.к у вас видимо нет виртуальных методов, вероятно надо использовать dynamic_cast

C++
1
2
3
4
5
6
7
8
identification * id;
complex * c;
for (int i=0; i<6; i++) {
if ((id = dynamic_cast<identification*>(arr[i]) != 0) {
id->find_char(...);
else if ...
}
}
numberone
0 / 0 / 0
Регистрация: 09.06.2012
Сообщений: 14
09.06.2012, 21:56  [ТС] #3
mystring* Factory(int choice) в этой функции че-то точку с запятой требует,
а воще я вот так написал незнай правильно или нет
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
char str[100];
        int n;
 
        cin >> n;
        mystring **p = new mystring*[n];
        for (int i = 0; i < n; ++i) 
        {
            char type;
            cin >> type;
            if (type == 'i') 
            {
                cin >> str;
                p[i] = new identification(str);
            } 
            else if (type == 'c') 
            {
                cin >> str;
                p[i] = new complex(str);
            }
        }
        int a, b, c;
        cin >> a >> b >> c;
        (*(complex*)p[a]) = (*(complex*)p[b]) + (*(complex*)p[c]);
 
        p[a]->show();
ток вот незнаю теперь как это связать с формой


Первоначально пункты меню "Тестирование" и "Начальные значения" запрещены.
После ввода числа создаваемых объектов по пункту меню "Кол-во элементов"
этот пункт запрещается и разрешается пункт "Начальные значения". При этом
на экране появляется окно [1] с количеством пронумерованных строк в соот-
ветствии со значением N, введенным ранее как число создаваемых объектов и
окно [2] для последующего вывода в него информации об отработке соответ-
ствующих конструкторов и деструкторов.
Пункт меню "Тестирование" разрешается после ввода начальных значений хотя
бы для одного объекта.
Все сформированные в процессе создания объектов строки отображаются в окне
[1] в соответствуюшей введенному номеру объекта строке с указанием типа
созданного объекта.
Если в процессе тестирования значение объекта изменяется, то новое значение
также должно отобразиться в окне [1].
Пункт меню "Операнды" служит для ввода номеров операндов, над которыми
будут производиться выбранные действия. Количество операндов может быть
от одного до трех (в зависимости от выбранного для тестирования метода).
Для операций "сложение", "вычитание","умножение","деление" обязательно
использование трех операндов ( два - над которыми производится действие
и один - куда будет помещен результат ).
Инициализация (или изменение значения и типа) одного или нескольких объектов
производного класса может производиться в любой момент времени после ввода
количества создаваемых значений без изменения значений и типа других ранее
проинициализированых объектов.
Допускается отсутствие пункта меню "Операнды" - в этом случае запрос
номеров операндов осуществляется сразу после выбора соответствующего метода
для тестирования.
Необходимо также предусмотреть вывод различной диагностической информации
( сообщения об ошибках, результат работы тестируемых методов не изменяющих
значение тестируемого объекта и т.п. )
Поскольку методы базового класса должны быть доступны объектам производных
классов, создаются и инициализируются только объекты производных классов.

Программа должна осуществлять полный контроль вводимой информации.

Более подробная информация о целях работы и составе разрабатываемого
программного обеспечения изложена в выданном преподавателем варианте
задания.
Миниатюры
Массив указателей на производные классы  
numberone
0 / 0 / 0
Регистрация: 09.06.2012
Сообщений: 14
10.06.2012, 15:06  [ТС] #4
(Не нашел как отредактировать сообщение, поэтому написал новое)

конкретно не понятно как из этого задания выполнять следующие пункты:

После ввода числа создаваемых объектов по пункту меню "Кол-во элементов"
этот пункт запрещается и разрешается пункт "Начальные значения". При этом
на экране появляется окно [1] с количеством пронумерованных строк в соот-
ветствии со значением N, введенным ранее как число создаваемых объектов
каким вообще элементом windows forms пользоваться чтобы это осуществить?

и вот это

Инициализация (или изменение значения и типа) одного или нескольких объектов
производного класса может производиться в любой момент времени после ввода
количества создаваемых значений без изменения значений и типа других ранее
проинициализированых объектов.
Добавлено через 4 часа 34 минуты
Как задать это все через консоль я понял, вроде сделал для консоли все кроме этого пункта

* для конструкторов копирования каждого класса предусмотреть
диагностическую печать количества его ввызовов в заданное место дисплея,
(рекомендуется использовать статические члены класса).
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
int n;
        cout << "Введите колличество элементов-указателей на базовый класс mystring";
        cin >> n;
        mystring **p = new mystring*[n];
        char str[100], type;
        for (int i = 0; i < n; i++) 
        {
            cout << "Выберите производный клас: 'i' - строка идентификатор, 'c' - комплексное число";
            cin >> type;
            cout << "Введите начальное значение";
            cin >> str;
            if (type == 'i') 
            {
                p[i] = new identification(str);
            } 
            else if (type == 'c') 
            {
                p[i] = new complex(str);
            }
        }
        int a, b, c;
        cout << "Выберите операнды для действия";
        cin >> a >> b >> c;
        cout << "Введите тип операндов";
        cin >> type;
        if (type == 'c')
        {
            (*(complex*)p[a]) = (*(complex*)p[b]) + (*(complex*)p[c]);
            (*(complex*)p[b]) = (*(complex*)p[c]);
        }
        else if (type == 'i') 
        {
            (*(identification*)p[a]) = (*(identification*)p[b]) + (*(identification*)p[c]);
            (*(identification*)p[b]) = (*(identification*)p[c]);
            cout << ((*(identification*)p[b]) < (*(identification*)p[c]));
            cout << "Введите символ для поиска в строке";
            cin >> str[0];
            cout << ((identification*)p[a])->find_char(str[0]) << " " << ((identification*)p[b])->find_char(str[0]) << " " << ((identification*)p[c])->find_char(str[0]) << "\n";
        }
        p[a]->show();
        p[b]->show();
        p[c]->show();
        cout << p[a]->get_length() << " " << p[b]->get_length() << " " << p[c]->get_length();
вот все, что получилось
numberone
0 / 0 / 0
Регистрация: 09.06.2012
Сообщений: 14
17.06.2012, 21:36  [ТС] #5
спасибо за помощь, переписал все на шарпе, там все намного проще оказалось
тему можно закрыть
sPLINTER_123
0 / 0 / 0
Регистрация: 17.06.2013
Сообщений: 5
27.06.2013, 23:50 #6
Цитата Сообщение от numberone Посмотреть сообщение
спасибо за помощь, переписал все на шарпе, там все намного проще оказалось
тему можно закрыть
кинь пжл мне эту прогу если сохранилась!
numberone
0 / 0 / 0
Регистрация: 09.06.2012
Сообщений: 14
28.06.2013, 11:00  [ТС] #7
@sPLINTER_123, держи CourseWorkVar17.rar
 Комментарий модератора 
Размещайте материалы на форуме, а не на сторонних ресурсах.
sPLINTER_123
0 / 0 / 0
Регистрация: 17.06.2013
Сообщений: 5
28.06.2013, 15:15 #8
Цитата Сообщение от numberone Посмотреть сообщение
@sPLINTER_123, держи Вложение 287445
Размещайте материалы на форуме, а не на сторонних ресурсах.
спасибо большое)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.06.2013, 15:15
Привет! Вот еще темы с ответами:

Производные классы - C++
Всем доброго времени суток! Столкнулся со следующей проблемой: в main создается матрица типа Basic (производный абстрактный класс для...

производные классы - C++
Задание: Разработайте программу на языке С++, использующую наследование. Вариант 18. Создайте базовый класс Complex (комплексное число)...

Указатели на производные классы - C++
Подскажите, как создать массив типа &quot;указатель на базовый класс&quot;, который будет содержать указатель указатели на производные...

Абстрактные и производные классы С++ - C++
Проблема: Есть базовый класс &quot;Фигура&quot;, и производные: &quot;Точка&quot;, &quot;Круг&quot;, &quot;Прямоугольник&quot;, &quot;Треугольник&quot;. Надо сделать чистую виртуальную...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
28.06.2013, 15:15
Ответ Создать тему
Опции темы

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