在这种情况下,您最好使用继承而不是组合。它将消除管理额外资源的需要,并允许您的“包装器”充当 POINT,而不需要整个 POINT 结构的访问器和修改器。
namespace wrapper {
class Point : public ::POINT
{
public:
Point() { }
~Point() { }
// The following accessors/mutators may not be necessary.
// They can however be handy with code that requires a pointer to
// member function (i.e. transformations)
void setX(long nx) { x = nx; }
long getX() { return x; }
void setY(long ny) { y = ny; }
long getY() { return y; }
// copy assignment operators
Point& operator=(const POINT& p)
{
x = p.x;
y = p.y;
return *this;
}
Point& operator=(const Point& p)
{
x = p.x;
y = p.y;
return *this;
}
};
}
如果你想防止直接访问你的成员POINT
可以使用私有继承。您还可以提供一个转换运算符来允许从Point
to的隐式转换POINT
。这将替换POINT* getStruct()
成员函数,但仍允许您轻松地将其与需要POINT
作为参数的函数一起使用。
namespace wrapper {
// Use private inheritance to prevent direct access to the
// members of POINT
class Point : private POINT
{
public:
Point() { }
~Point() { }
// Copy constructor
Point(const ::POINT& p) { x = p.x; y = p.y; }
// Accessor/mutators
void setX(long nx) { x = nx; }
long getX() { return x; }
void setY(long ny) { y = ny; }
long getY() { return y; }
// Allow implicit conversions to POINT* when necessary
// Replaces getStruct()
operator ::POINT*() { return this; }
operator const ::POINT*() const { return this; }
// Copy assignment operators
Point& operator=(const POINT& p)
{
x = p.x;
y = p.y;
return *this;
}
Point& operator=(const Point& p)
{
x = p.x;
y = p.y;
return *this;
}
};
}
extern "C" void someCFunction(POINT *);
int main()
{
POINT cp;
wrapper::Point p;
p.x = 0; // FAIL
p.setX(0); // OK
p = cp; // OK
// No need to call getPoint().
someCFunction(p);
}
注意:我已经删除了使用,inline
因为它们是不必要的。在类定义中定义的函数已经是内联的(参见 $7.1.2/3)。感谢克里斯提醒我。