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

Ваш аккаунт

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

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

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

вопрос по инициализации объектов (С++)

1.8K
08 марта 2009 года
igor_nf
256 / / 13.12.2006
Есть структура геометрических фигур:

 
Код:
struct Point {
 int x;
 int y;
};

struct Shape {
 vector<Point> points;
 int count;
};  //count - количество вершин


Очевидно, что количество точек в Shape будет зависить от количества вершин. Требуется при создании Shape иметь возможность задавать количество вершин и, соответственно, координаты каждой из вершин. Как это сделать элегантно - ума не приложу. Плюс хочется хоть как-то следовать принципам ООП - например, чтобы только Shape имел возможность создавать экземляры объектов Point. Думал о varargs - но это, вроде как, не C++-way. Думал о фабрике объектов, но вопрос об инициализации, да и о целесообразности использования фабрики, ввиду недостаточного опыта, всё равно остаётся для меня открытым. Кто что может предложить ?
1.8K
08 марта 2009 года
igor_nf
256 / / 13.12.2006
Конечно можно написать конструктор для Shape вида
 
Код:
Shape(int cnt, const vector<Point>& pnts): count(cnt), points(pnts) {}

Но тогда перед созданием Shape придётся создавать ещё и вектор точек, а потом уже передавать его в конструктор Shape:
 
Код:
vector<Point> p;
..//инициализируем p
Shape(3, p);
..

что само по себе чрезвычайно черезжопно и чревато ошибками. Каков правильный путь ? Использовать конструктор с переменным количеством параметров ?
11
08 марта 2009 года
oxotnik333
2.9K / / 03.08.2007
Цитата: igor_nf
Конечно можно написать конструктор для Shape вида
 
Код:
Shape(int cnt, const vector<Point>& pnts): count(cnt), points(pnts) {}
Но тогда перед созданием Shape придётся создавать ещё и вектор точек, а потом уже передавать его в конструктор Shape:
 
Код:
vector<Point> 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);
}
255
08 марта 2009 года
Dart Bobr
1.4K / / 09.04.2004
смысл в том, что есть такая штука, как std::vector::reserve
Мне вот только не понятно, как автор топика хочет инициализировать форму, не из вектора.
87
08 марта 2009 года
Kogrom
2.7K / / 02.02.2008
Можно еще инициализировать с помощью простого массива. Плюс - быстрота и простота, минус - больше вероятность ошибки... Правда, тут придется усовершенствовать Point.
Например:
Код:
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;
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог