Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Уникальность экземпляров класса C#/C++

11
14 мая 2008 года
oxotnik333
2.9K / / 03.08.2007
Есть класс:
 
Код:
clacc Point
{
   private:
   double x;
   double y;
   
   public:
   Point (double X, double Y)  {x=X; y=Y;}
   // реализация всякая
};


в цикле создаем множество экземпляров этого класса:

 
Код:
while (file.read())
{
  Point *pt = new Point (GetX(), GetY());
// помещаем pt в масив
}


необходимо в конструкторе предусмотреть возможность не создавать экземпляр в случае если уже существует набор (x, y), т.е. не создавать 2 и более точек с одинаковыми координатами.
Как в конструкторе найти идентичный экземпляр?
Как не создавать класс, если найден?
37K
14 мая 2008 года
iyulka
12 / / 06.05.2008
Углядеть это в конструкторе не получится.
Переопредели оператор "==" либо же добавь в класс функцию, сравнивающую 2 объекта данного класса и исключай дублирование в момент заполнения массива, проверяя, нет ли уже подобного объекта в массиве, либо убирай дубли после заполнения массива.
1
14 мая 2008 года
kot_
7.3K / / 20.01.2000
Во первых необходимо переопределить операторы сравнения для классов, во вторых - это как раз идеально тот случай когда нужно использовать STL.
В этом случае как раз и возможно будет обрабатывать это событие в констуркторе.
11
14 мая 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: kot_
это как раз идеально тот случай когда нужно использовать STL.



Отсюда поподробней пожалуйста:
Что именно из STL использовать и каким образом?

На данный момент я вижу выход такой: в конструктор передавать заполняемый массив и в конструкоре бегать по этому массиву сравнивая this с элементами массива, в случае равенства this = NULL;
ЗЫ: чую такой вариант через жо...

353
14 мая 2008 года
Nixus
840 / / 04.01.2007
Чтобы определять уникальность нужно хранить список уже созданных объектов и прверять перед созданием на уникальность. Подойдет конетейнер map из stl.
11
14 мая 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: Nixus
Чтобы определять уникальность нужно хранить список уже созданных объектов и прверять перед созданием на уникальность. Подойдет конетейнер map из stl.



что в таком случае в качестве ключа использовать (координаты то 2)

1
14 мая 2008 года
kot_
7.3K / / 20.01.2000
Цитата: oxotnik333
Отсюда поподробней пожалуйста:
Что именно из STL использовать и каким образом?

На данный момент я вижу выход такой: в конструктор передавать заполняемый массив и в конструкоре бегать по этому массиву сравнивая this с элементами массива, в случае равенства this = NULL;
ЗЫ: чую такой вариант через жо...


Ну что использовать из STL тебе уже ответили - я бы едиственно хотел добавить - что все не так однозначно. Во первых, в контейнере ты можешь хранить уникальный идентификатор класса (как пример указатель на него), а при создании (т.е. в конструкторе) проверять свои координаты используя фаблоны функций.
Но здесь тебе посоветовать достаточно сложно - потому что структуру и логику зоздания классов а так же их дальнейшее использование знаешь только ты - я (ну так на вскидку) - определил бы функцию сравнения координат и юзал ее в конструкторе - если координаты не равны - класс создаеться - иначе генерируеться исключение - но надо понимать что это не готовое решение. Кроме того возможно тебе надо будет использовать не один массив а как минимум два - я бы предложил использовать 2 map+1 set - но ксожалению объяснять свое решение времени не имею - да и от реализации все зависит.

276
14 мая 2008 года
Rebbit
1.1K / / 01.08.2005
Вот только зачем все это все в конструкторе делать ? Зачем чтото кудато передавать ? Не используй конструктор напрямую. Пользуйся фабрикой.
353
14 мая 2008 года
Nixus
840 / / 04.01.2007
Цитата: oxotnik333
что в таком случае в качестве ключа использовать (координаты то 2)



Примерно так:

Код:
clacc Point
{
   // ...
   int operator == (const Point& P) const;

   static std::map<Point, Point*> Uniq;
   static Point* Create(double X, double Y) {
         Point K(X,Y);

         if(!Uniq[K]) {
               return Uniq[K] = new Point(X, Y);
         }

         return Uniq[K];
   }
};
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог