Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.06.2012, 18:27   #1
number0ne
 
Регистрация: 09.06.2012
Сообщений: 7
По умолчанию Массив указателей на производные классы

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

Код:
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();        // Временно. Для тестирования вывод строки на экран
};
и производные от него классы Строка идентификатор и комплексное число
Код:
// Производный от строка класс строка идентификатор (_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

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

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

Код:
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);
    }
Но как задать номер элемента, его тип и начальное значение, я хз
number0ne вне форума Ответить с цитированием
Старый 09.06.2012, 18:42   #2
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

ну, видимо, как-то так
Код:
for (int i = 0; i < n; ++i) {
  char type;
  std::cin >> type;
  if (type == 'i') {
    p[i] = new identification;
  } else if (type == 'c') {
    p[i] = new complex;
  }
}
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 09.06.2012, 19:48   #3
number0ne
 
Регистрация: 09.06.2012
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Granus Посмотреть сообщение
ну, видимо, как-то так
Код:
for (int i = 0; i < n; ++i) {
  char type;
  std::cin >> type;
  if (type == 'i') {
    p[i] = new identification;
  } else if (type == 'c') {
    p[i] = new complex;
  }
}
спасибо, переделал твой код
Код:
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);
			}
		}
вроде работает
Можно еще вопрос?
Цитата:
Пункт меню "Операнды" служит для ввода номеров операндов, над которыми
будут производиться выбранные действия. Количество операндов может быть
от одного до трех (в зависимости от выбранного для тестирования метода).
Для операций "сложение", "вычитание","умножение","делени е" обязательно
использование трех операндов ( два - над которыми производится действие
и один - куда будет помещен результат ).
Предположим a, b, c это индексы операндов

но

Код:
int a, b, c;
		cin >> a >> b >> c;
		p[a] = p[b] + p[c];
чето не работает

где p[a] , p[b] , p[c] из прошлого отрывка кода(операции +, = переопределены и для complex, и для identification)

Последний раз редактировалось number0ne; 09.06.2012 в 19:52.
number0ne вне форума Ответить с цитированием
Старый 09.06.2012, 19:51   #4
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Что именно не работает?
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 09.06.2012, 19:54   #5
number0ne
 
Регистрация: 09.06.2012
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Granus Посмотреть сообщение
Что именно не работает?
Подчеркивает p[c]
Цитата:
Error:Выражение должно иметь целочисленный или перечисляемый тип
number0ne вне форума Ответить с цитированием
Старый 09.06.2012, 19:58   #6
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

У Вас в базовом классе операция сложения не определена. Подозреваю, Вам нужно сделать в mystring виртуальный оператор сложения. Да, неплохо бы перед сложением удостовериться, что типы всех объектов совпадают, иначе будете складывать identification с complex.
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 09.06.2012, 20:55   #7
number0ne
 
Регистрация: 09.06.2012
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Granus Посмотреть сообщение
У Вас в базовом классе операция сложения не определена. Подозреваю, Вам нужно сделать в mystring виртуальный оператор сложения. Да, неплохо бы перед сложением удостовериться, что типы всех объектов совпадают, иначе будете складывать identification с complex.
С переопределением операции в базовом классе чет ничего не получается,
вот сделал чето сам не пойму че так вроде работает, но только если все в указатели на комплексное число делать или только на строку идентификатор, а как и на то и на другое шоб автоматом определял хз
Код:
int a, b, c;
		cin >> a >> b >> c;
		(*(complex*)p[a]) = (*(complex*)p[b]) + (*(complex*)p[c]);

		p[a]->show();
number0ne вне форума Ответить с цитированием
Старый 09.06.2012, 21:02   #8
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Вы знаете, что такое виртуальные функции? Если нет, то почитайте, это и есть решение Вашего вопроса. Если да, то таких вопросов у Вас не должно возникать.
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 09.06.2012, 21:03   #9
number0ne
 
Регистрация: 09.06.2012
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Granus Посмотреть сообщение
Вы знаете, что такое виртуальные функции? Если нет, то почитайте, это и есть решение Вашего вопроса. Если да, то таких вопросов у Вас не должно возникать.
спасибо, почитаю
number0ne вне форума Ответить с цитированием
Старый 10.06.2012, 10:37   #10
number0ne
 
Регистрация: 09.06.2012
Сообщений: 7
По умолчанию

Теперь не могу разобраться со второй частью задания

Программа должна иметь меню и окна для отображения
необходимой информации.

Предлагается следующая организация работы программы:

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

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

Более подробная информация о целях работы и составе разрабатываемого
программного обеспечения изложена в выданном преподавателем варианте
задания.


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

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

Цитата:
Инициализация (или изменение значения и типа) одного или нескольких объектов
производного класса может производиться в любой момент времени после ввода
количества создаваемых значений без изменения значений и типа других ранее
проинициализированых объектов.
Изображения
Тип файла: jpg 1.jpg (83.2 Кб, 119 просмотров)
number0ne вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
производные классы missg C++ Builder 15 10.04.2012 18:16
Указатель на массив указателей на массив char'ов... SrgGld Общие вопросы C/C++ 0 19.11.2010 23:35
класс employee и производные классы olik83 Общие вопросы C/C++ 7 21.09.2009 22:44
С++ Производные классы (Ошибка) Sweta Помощь студентам 9 23.04.2008 12:58
базовые и производные классы (В чём моя ошибка) umnix Общие вопросы C/C++ 5 01.12.2007 17:26