Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


Информационный Канал Subscribe.Ru

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 114
от 28.05.2005, 14:10

Администратор:Калашников О.А.
В номере:Вопросов: 1, Ответов: 4


Вопрос № 21226: Здравствуйте эксперты. Как-то я задавал вопрос (18879) об определении констант внутри класса. Спасибо за все присланные ответы, но решить свою проблему не получилось. Попробую рассказать о ней чуть подробней, может кто подскажет как ...

Вопрос № 21226
Здравствуйте эксперты.
Как-то я задавал вопрос (18879) об определении констант внутри класса.
Спасибо за все присланные ответы, но решить свою проблему не получилось.
Попробую рассказать о ней чуть подробней, может кто подскажет
как красиво ее разрешить:
Есть несколько сходных классов, которые описывают различные устройства.
(физические,например датчики, контроллеры).
Каждое устройство характеризуется набором определенных констант: параметры(например количество аналоговых входов) и кодов ошибок.
которые к тому же используются при определении класса (например при объявлении массива данных в класса).
Конечно, можно для каждого класса определить свой набор, добавляя перед наименованием какой нибудь префикс, типа TypeDvc_НаименованиеПараметра.
Но в моем случае это как-то не очень красиво и не удобно, так как данные константы используются часто одинаково, и для каждого класса приходится переписывать имена, а если префикс давать более-менее осмысленный, то получается просто длинно.
Как бы поступили в данном случае эсперты.
Компилятор Visual C++6
с уважением Ильдар
ildar_trvl@rambler.ru
Отправлен: 23.05.2005, 14:01
Вопрос задал: ildar (статус: Посетитель)
Всего ответов отправлено: 4

Отвечает: Jadd
Здравствуйте, ildar!
Открываем учебник по С++ и читаем главу про ООП и полиморфизм. Так вот. Берем и пишем родительский класс. Например, так:
class CDevice
{
private:
int nOutputCount;
int SomeConstant;
......
public:
void SomeFunc();
};
Дальше начинаем делать "ветки" от родителя. К примеру:
class CController: public CDevice
{
//делаем инициализацию и прочее
};
А потом по коду уже объявляем переменную типа CDevice и, на основании каких-то условий, создаем объект типа, производного от CDevice. Например:
//some code
CDevice *device;
//к примеру
if (nType == CONTROLLER)
device = new CController();
if (nType == DATCHIK)
device = new CDatchik()
ну и так далее. И дальше можно использовать всю силу полиморфизма, применяя в родительских классах виртуальные функции и переопределяя их в дочерних. Удачи.
Ответ отправил: Jadd (статус: 4-ый класс)
Отправлен: 23.05.2005, 14:32

Отвечает: DSota
Здравствуйте, ildar!
Для каждого устройства можно создать свой класс, дочерний от класса, который у
тебя уже есть, отличающийся от других только значением констант (см. пример).

Приложение:

Ответ отправил: DSota (статус: Студент)
Отправлен: 23.05.2005, 15:15

Отвечает: yatagan
Здравствуйте, ildar!
Попробуй использовать перечисления -- наборы именованых целочисленных констант. НАпример:
// sensor.h
class sensor
{
public:
//обьявление типа данных "перечисление всяких констант"
enum constants {
//кол-во портов
num_inputs = 2,
//код ошибки
error_overflow = 548762,
//код ошибки
error_baddata = 14577};
};
//
=============================
теперь как обращатся к этим константам:
=============================
в методах класса:
//
sensor::sensor()
{
//получить значение константы
int x = constants::num_inputs;
//то же что и:
x = num_inputs;
}
//
-------------------------------
во внешних функциях:
//main.cpp
#include "sensor.h"
#include <iostream.h>
int main()
{
//получить значение константы
cout << sensor::constants::num_inputs << endl;
//то же что и:
cout << sensor::num_inputs << endl;
return 0;
}
//
-------------------------------
понятное дело, что изменять значения таких констант нельзя...
я не совсем понял, что ты имел в виду тут:
"которые к тому же используются при определении класса (например при
объявлении массива данных в класса)."
если еще есть вопросы -- уточни -- постараюсь помочь:)
Ответ отправил: yatagan (статус: 1-ый класс)
Отправлен: 23.05.2005, 18:59

Отвечает: Raptor1
Здравствуйте, ildar!
Я бы классы устройств сделал наследником некоторого виртуального устройства в котором бы определил защищенные параметры абстрактного устройства (то же число входов и др.) и функции для доступа к ним. Если параметры могут быть произвольными, например температура и т.д. то их тоже следует определить в виде некоторого класса (структуры) с именем параметра и возможностью получить значение (GetData какой нибудь). В классе устройств будет присутствовать некоторый вектор или очередь с параметрами присущими данному устройству. Тогда можно реализовать получение параметра по его имени в некоторой функции, в которой будет выполняться поиск парамерта с запрошенным именем и возврат его значения в случае удачного поиска, или какого нибудь ошибочного значения (например -1) в случае отсутствия запрошенного параметра.
Ответ отправил: Raptor1 (статус: 4-ый класс)
Отправлен: 24.05.2005, 00:02


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2005, RusFAQ.ru, Россия, Москва. Все права защищены.
Идея, дизайн, программирование, авторское право: Калашников О.А.

Яндекс


Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.cplus
Отписаться
Вспомнить пароль

В избранное