Простой вопрос по записи новых данных в объект. Пусть есть такой код:
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)?
Здравствуйте, 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)