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

Обсуждение

Неизвестный
23.05.2005, 14:32
общий
это ответ
Здравствуйте, 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()
ну и так далее. И дальше можно использовать всю силу полиморфизма, применяя в родительских классах виртуальные функции и переопределяя их в дочерних. Удачи.
Неизвестный
23.05.2005, 15:15
общий
это ответ
Здравствуйте, ildar!
Для каждого устройства можно создать свой класс, дочерний от класса, который у
тебя уже есть, отличающийся от других только значением констант (см. пример).


Приложение:
class Device{ virtual int const1(); virtual int const2(); ...; };class datchik:public Device{ virtual int const1(){return 7;}; virtual int const2(){return 8;}; }class kontroller:public Device{ virtual int const1(){return 7;}; virtual int const2(){return 8;}; }device* c1;datchik* c2;kontroller* c3;...c1=c3;printf("...",c1->const1());c1=c2;printf("...",c1->const1());
Неизвестный
23.05.2005, 18:59
общий
это ответ
Здравствуйте, 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;
}
//
-------------------------------
понятное дело, что изменять значения таких констант нельзя...
я не совсем понял, что ты имел в виду тут:
"которые к тому же используются при определении класса (например при
объявлении массива данных в класса)."
если еще есть вопросы -- уточни -- постараюсь помочь:)
Неизвестный
24.05.2005, 00:02
общий
это ответ
Здравствуйте, ildar!
Я бы классы устройств сделал наследником некоторого виртуального устройства в котором бы определил защищенные параметры абстрактного устройства (то же число входов и др.) и функции для доступа к ним. Если параметры могут быть произвольными, например температура и т.д. то их тоже следует определить в виде некоторого класса (структуры) с именем параметра и возможностью получить значение (GetData какой нибудь). В классе устройств будет присутствовать некоторый вектор или очередь с параметрами присущими данному устройству. Тогда можно реализовать получение параметра по его имени в некоторой функции, в которой будет выполняться поиск парамерта с запрошенным именем и возврат его значения в случае удачного поиска, или какого нибудь ошибочного значения (например -1) в случае отсутствия запрошенного параметра.
Форма ответа