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); }