Уникальность экземпляров класса C#/C++
{
private:
double x;
double y;
public:
Point (double X, double Y) {x=X; y=Y;}
// реализация всякая
};
в цикле создаем множество экземпляров этого класса:
{
Point *pt = new Point (GetX(), GetY());
// помещаем pt в масив
}
необходимо в конструкторе предусмотреть возможность не создавать экземпляр в случае если уже существует набор (x, y), т.е. не создавать 2 и более точек с одинаковыми координатами.
Как в конструкторе найти идентичный экземпляр?
Как не создавать класс, если найден?
Переопредели оператор "==" либо же добавь в класс функцию, сравнивающую 2 объекта данного класса и исключай дублирование в момент заполнения массива, проверяя, нет ли уже подобного объекта в массиве, либо убирай дубли после заполнения массива.
В этом случае как раз и возможно будет обрабатывать это событие в констуркторе.
Отсюда поподробней пожалуйста:
Что именно из STL использовать и каким образом?
На данный момент я вижу выход такой: в конструктор передавать заполняемый массив и в конструкоре бегать по этому массиву сравнивая this с элементами массива, в случае равенства this = NULL;
ЗЫ: чую такой вариант через жо...
что в таком случае в качестве ключа использовать (координаты то 2)
Что именно из STL использовать и каким образом?
На данный момент я вижу выход такой: в конструктор передавать заполняемый массив и в конструкоре бегать по этому массиву сравнивая this с элементами массива, в случае равенства this = NULL;
ЗЫ: чую такой вариант через жо...
Ну что использовать из STL тебе уже ответили - я бы едиственно хотел добавить - что все не так однозначно. Во первых, в контейнере ты можешь хранить уникальный идентификатор класса (как пример указатель на него), а при создании (т.е. в конструкторе) проверять свои координаты используя фаблоны функций.
Но здесь тебе посоветовать достаточно сложно - потому что структуру и логику зоздания классов а так же их дальнейшее использование знаешь только ты - я (ну так на вскидку) - определил бы функцию сравнения координат и юзал ее в конструкторе - если координаты не равны - класс создаеться - иначе генерируеться исключение - но надо понимать что это не готовое решение. Кроме того возможно тебе надо будет использовать не один массив а как минимум два - я бы предложил использовать 2 map+1 set - но ксожалению объяснять свое решение времени не имею - да и от реализации все зависит.
Примерно так:
{
// ...
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];
}
};