2010-06-04 3 views
1

The diagram http://www.freeimagehosting.net/uploads/2fd3f4161c.pngC++ - Где хранить глобальный счетчик?

Ниже приведена диаграмма Minimalist-UML приложения, над которым я работала. Он должен имитировать управление связкой датчиков, относящихся к разным измерениям. Пожалуйста игнорировать House класс, схема устарела ...

Однако, у меня есть проблема. Каждый датчик (звук, контакт, тепло, давление, газ - все эти наследуются от sensor) имеет уникальный идентификатор, начинающийся с 0 для первого и заканчивающийся на общем числе датчиков - 1.

Для передового опыта ради чего я должен хранить общее количество датчиков, поэтому классы, которые я использую для ввода/вывода файлов (сохранение и загрузка) и вставка новых датчиков, могут получить и увеличить этот счетчик?

Благодарим вас за внимание!

ответ

4

Одним из вариантов было бы создать статическую функцию в классе Sensor который увеличивает и возвращает статическую переменную счетчика. Конструктор для Sensor может вызвать эту функцию, чтобы получить идентификатор.

// header file 
class Sensor 
{ 
... 
protected: 
    static int getId() { return id++; } 
private: 
    static int id; 
    int myId; 
}; 

// .cpp file 
int Sensor::id = 0; 

Sensor::Sensor(...) 
: myId(getId()) 
    ... 
{} 

Я игнорирую проблемы с резьбой и персистентностью. Но, надеюсь, это дает вам лучшую идею.

+0

Я вижу. Будет ли эта переменная определяться как атрибут класса? –

+0

@Francisco - Я добавил код, чтобы уточнить, что я имел в виду. –

+0

Спасибо! Если я буду указывать свой конструктор таким образом, будет ли каждый новый конкретный датчик («тепло», «газ» и т. Д.) Иметь уникальный идентификатор? Или только базовый 'датчик' я создаю? –

-1

Посмотрите на Singleton pattern, предполагая, что вы не хотите делать это с помощью какой-либо базы данных.

+1

Что не так с глобальным? Зачем ограничивать что-либо одним экземпляром? Http: // jalf.dk/blog/2010/03/singletons-solutions-problems-you-didnt-know-you-never-had-since-1995/ – GManNickG

+0

Как я понимаю, OP хочет объект, который может иметь полномочия выдавать идентификатор номера. Наличие нескольких экземпляров этого органа создаст проблемы и нарушит требования, и оно больше не будет уникальным идентификационным номером. –

+0

Путь к сложным для моего уровня новичка. Но все равно спасибо. –

5

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

Если несколько объектов создают датчики, им необходимо назначить указатель или ссылку на поставщика идентификаторов при их создании, и они должны запросить у этого поставщика новый уникальный идентификатор при создании новых объектов датчика.

+0

Понял. Спасибо. Где я должен определить, что «поставщик идентификаторов»? –

+0

@Francisco: Независимо от того, что предоставляет идентификаторы, необходимо отслеживать, сколько идентификаторов оно назначило и должно знать, сколько из них назначено. Я вообще не вижу причины использовать глобальный или синглтон в этом сценарии. –

1

Ваш уникальный идентификатор, такой как идентификатор таблицы базы данных, скорее всего, будет иметь некоторые проблемы.

Возможно, вы, вероятно, обнаружите, что ваш идентификатор должен сохраняться через сеансы - что идентификатор вашего окна используется в некоторых других отношениях.

Возможно, в какой-то день вы также обнаружите, что он должен быть уникальным для нескольких наборов серверов/клиентов.

Я просто предлагаю вам рассмотреть эти проблемы с места в карьер.

Что касается идентификатора, который должен быть сгенерирован, поскольку все ваши классы «Sensor» наследуются от одного базового класса, я думаю, что я бы сгенерировал его с помощью метода threadafe в этом базовом классе - и я бы его там сохранил также.

+0

Пожалуйста, укажите более подробную информацию, если у вас есть время. Как определить его и т. Д.! Спасибо. –

0

В чем проблема? используете ли вы Vector для хранения ваших датчиков? определить вектор хранения объектов-датчиков в доме.

может получить доступ и увеличивать этот счетчик

вы не должны делать это, Vector делает это для вас

+1

Нет! Не определяйте 'std :: list'! Это контейнер * последнего * курорта. Используйте 'std :: vector' или' std :: deque' и только если они не соответствуют вашим потребностям, если вы посмотрите на 'std :: list'. –

+0

ОК, я говорил больше «вообще» – OlimilOops

Смежные вопросы