【发布时间】:2010-06-25 21:12:35
【问题描述】:
考虑以下代理类:
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()。此外,我希望能够将坐标值分配给来自不同代理的坐标值(即@ 987654323@).
在我上面的类中operator=应该是什么意思?复制rhs 的指针(浅拷贝)或rhs 的值?还是我应该将operator= 设为私有并提供两个成员函数以避免operator= 的歧义?
编辑:
好的,这里有一些背景信息。我正在围绕第 3 方 GIS 库(shapelib)编写一个包装器,它将顶点坐标(x、y、z、m)存储在单独的数组(而不是结构数组)中。我的代理类用于使这个数组结构看起来更像一个结构数组。它与自定义顶点迭代器类协同工作,使处理顶点范围变得更加容易。
Shapelib 处理内存管理。我的代理类所做的只是在顶点数据中呈现不同的“视图”。当用户使用我的代理操作顶点坐标时,它实际上是在操作 shapelib 形状对象中的顶点坐标。
【问题讨论】:
-
这是一个真实的例子吗?如果是,为什么你仍然需要指针?由于您所描述的语义问题,并且因为它很容易引入内存泄漏或悬空指针,因此存储值会更好。
-
这是一个真实示例的简化版本。我正在围绕一个将 x、y、z、m 坐标存储在单独数组(而不是结构数组)中的第 3 方 GIS 库(shapelib)编写一个包装器。我的代理类与自定义顶点迭代器类协同工作,这使得在 3rd 方库中使用顶点范围变得更加容易。
-
我的语义问题也出现在代理模式的更“合法”使用中。我想知道在这个问题上流行的智慧是什么。
-
我刚刚意识到
operator==也有同样的问题。
标签: c++ design-patterns proxy