Реинициализация объекта через конструктор
От: wagant  
Дата: 25.06.11 23:23
Оценка:
Простой вопрос по записи новых данных в объект. Пусть есть такой код:

class Point
{
public:
    Point::Point(double x, double y) : m_x(x), m_y(y) { }

private:
    double m_x;
    double m_y;
}

int main(int argc, char *argv[])
{
    Point p(0.5, 0.5);

    p = Point(0.7, 0.7);  // Насколько это нормально и есть ли лучшее решение?
}


Вопрос в том, насколько реинициализая объекта через создание нового временного обекта эффективна? И если неэффективна, то как правильно это делать? Писать отдельную фукнцию инициализации, что-то типа p.SetXY(0.7, 0.7)?
Re: Реинициализация объекта через конструктор
От: Caracrist https://1pwd.org/
Дата: 26.06.11 00:28
Оценка: +2
Здравствуйте, wagant, Вы писали:

W>Простой вопрос по записи новых данных в объект. Пусть есть такой код:


W>
W>class Point
W>{
W>public:
W>    Point::Point(double x, double y) : m_x(x), m_y(y) { }

W>private:
W>    double m_x;
W>    double m_y;
W>}

W>int main(int argc, char *argv[])
W>{
W>    Point p(0.5, 0.5);

W>    p = Point(0.7, 0.7);  // Насколько это нормально и есть ли лучшее решение?
W>}
W>


W>Вопрос в том, насколько реинициализая объекта через создание нового временного обекта эффективна? И если неэффективна, то как правильно это делать? Писать отдельную фукнцию инициализации, что-то типа p.SetXY(0.7, 0.7)?


вот реальная реинициализация:
p.~Point();
// между строк
new (&p) Point(0.7, 0.7);

Но это не читабильно, и есть место между строк где объект не валидный. А вдруг туда однажды попадёт код? можно конечно обернуть это дело в функцию или дефайн, IMHO — грязно.

в твоём примере используется оператор присваивания(в данном случае автоматически генерируемый)
p = Point(0.7, 0.7);

Это хороший подход если повезёт с оптимизатором(тоесть класс должен быть простым).
А также такой подход стоит выбрать для move-constructible классов.

если нет c++0x или просто класс swappable, такой вариант может оказаться оптимальным:
std::swap(p, Point(0.7, 0.7)); // p.swap(Point(0.7, 0.7));


и наконец:
p.reset(0.7,0.7); // reinit...

самый универсальный вариант, даёт максимальную гибкость, читабелен, и поддаётся оптимизации. Однако требует отдельной реализации в отличии от возможности проехаться на уже реализованных свойствах (swappable, move-constructible)
~~~~~
~lol~~
~~~ Single Password Solution
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.