struct Point {
int x;
int y;
};
struct Shape {
vector<Point> points;
int count;
}; //count - количество вершин
вопрос по инициализации объектов (С++)
Код:
Очевидно, что количество точек в Shape будет зависить от количества вершин. Требуется при создании Shape иметь возможность задавать количество вершин и, соответственно, координаты каждой из вершин. Как это сделать элегантно - ума не приложу. Плюс хочется хоть как-то следовать принципам ООП - например, чтобы только Shape имел возможность создавать экземляры объектов Point. Думал о varargs - но это, вроде как, не C++-way. Думал о фабрике объектов, но вопрос об инициализации, да и о целесообразности использования фабрики, ввиду недостаточного опыта, всё равно остаётся для меня открытым. Кто что может предложить ?
Код:
Shape(int cnt, const vector<Point>& pnts): count(cnt), points(pnts) {}
Но тогда перед созданием Shape придётся создавать ещё и вектор точек, а потом уже передавать его в конструктор Shape:
Код:
vector<Point> p;
..//инициализируем p
Shape(3, p);
..
..//инициализируем p
Shape(3, p);
..
что само по себе чрезвычайно черезжопно и чревато ошибками. Каков правильный путь ? Использовать конструктор с переменным количеством параметров ?
Цитата: igor_nf
Конечно можно написать конструктор для Shape вида
Но тогда перед созданием Shape придётся создавать ещё и вектор точек, а потом уже передавать его в конструктор Shape:
что само по себе чрезвычайно черезжопно и чревато ошибками. Каков правильный путь ? Использовать конструктор с переменным количеством параметров ?
Код:
Shape(int cnt, const vector<Point>& pnts): count(cnt), points(pnts) {}
Код:
vector<Point> p;
..//инициализируем p
Shape(3, p);
..
..//инициализируем p
Shape(3, p);
..
смысл тогда в 1-м параметре, если количество можно узнать stl::vector::size()
PS: а чем черезжопно? создаются точки, по которым рисуется фигура, все логично.
Если надо сначала создать фигуру а потом определить ей вершины, спасет метод
Код:
void Shape::AddPoint(int x, int y)
{
Point pt;
pt.x = x;
pt.y = y;
points.push_back(pt);
}
{
Point pt;
pt.x = x;
pt.y = y;
points.push_back(pt);
}
Мне вот только не понятно, как автор топика хочет инициализировать форму, не из вектора.
Например:
Код:
struct Point {
int x;
int y;
Point(int xx, int yy):x(xx), y(yy){}
};
class Shape {
vector<Point> points;
size_t count; // зачем нужен - не ясно, но пусть
public:
Shape(const Point* begin, const Point* end):points(begin, end), count(points.size()){}
Shape(){}
void Print()
{
for(size_t i = 0; i < points.size(); ++i)
cout << points.x << ' ' << points.y << endl;
}
};
int main()
{
const Point v[] = {Point(0,0), Point(5,0), Point(5,5), Point(0,5)};
Shape sh(v, v + 4);
cout << "Shape 1:" << endl;
sh.Print();
Shape sh2(v, v + 3);
cout << "Shape 2:" << endl;
sh2.Print();
return 0;
}
int x;
int y;
Point(int xx, int yy):x(xx), y(yy){}
};
class Shape {
vector<Point> points;
size_t count; // зачем нужен - не ясно, но пусть
public:
Shape(const Point* begin, const Point* end):points(begin, end), count(points.size()){}
Shape(){}
void Print()
{
for(size_t i = 0; i < points.size(); ++i)
cout << points.x << ' ' << points.y << endl;
}
};
int main()
{
const Point v[] = {Point(0,0), Point(5,0), Point(5,5), Point(0,5)};
Shape sh(v, v + 4);
cout << "Shape 1:" << endl;
sh.Print();
Shape sh2(v, v + 3);
cout << "Shape 2:" << endl;
sh2.Print();
return 0;
}