Рассмотрим следующий класс прокси:
class VertexProxy
{
public:
VertexProxy(double* x, double* y, double* z)
: x_(x), y_(y), z_(z) {}
VertexProxy(const VertexProxy& rhs)
: x_(rhs.x_), y_(rhs.y_), z_(rhs.z_) {}
// Coordinate getters
double x() const {return *x_;}
double y() const {return *y_;}
double z() const {return *z_;}
// Coordinate setters
VertexProxy& x(double val) {*x_ = val; return *this;}
VertexProxy& y(double val) {*y_ = val; return *this;}
VertexProxy& z(double val) {*z_ = val; return *this;}
VertexProxy& operator=(const VertexProxy& rhs)
{
// Should it be this
x_ = rhs.x_; y_ = rhs.y_; z_ = rhs.z_;
// or this?
*x_ = *rhs.x_; *y_ = *rhs.y_; *z_ = *rhs.z_;
return *this;
}
private:
double* x_; double* y_; double* z_;
};
Мне нужно иметь возможность сбросить прокси, чтобы он содержал разные координатные указатели (аналогично boost::shared_ptr.reset()
. Кроме того, я хотел бы иметь возможностьназначить значения координат значениям из другого прокси (например, proxy1.assign(proxy2)
).
Каков смысл значения operator=
в моем классе выше? Чтобы скопировать указатели rhs
(мелкая копия) или rhs
? Или я должен просто сделать operator=
закрытым и предоставить две функции-члена, чтобы избежать неоднозначности operator=
?
РЕДАКТИРОВАТЬ:
Хорошо, вот некоторая справочная информация. Я пишу обертку вокруг сторонней ГИС-библиотеки (shapelib), которая хранит координаты вершин (x, y, z, m) в отдельных массивах (вместо массива структур).Мой прокси-класс используется для того, чтобы эта структура массивов выглядела как массив структур и работает в тандеме с настраиваемым классом вершинных итераторов, что значительно облегчает работу с диапазонами вершин.
Shapelib обрабатываетуправление памятью.Все, что делает мой прокси-класс, - это другое представление о данных вершин.Когда пользователь манипулирует координатами вершины, используя мой прокси, он фактически манипулирует координатами вершины в объекте формы shapelib.