#include <iostream>
using Color = int;
struct Shape
{
double area = 0;
};
class Geometry
{
public:
// everybody can alter the color of the geometry, so
// they get a mutable reference
Color& color() { return m_color; };
// not everybody can alter the shape of the Geometry, so
// they get a constant reference to the shape.
Shape const& shape() const { return m_shape; };
protected:
// derived classes can alter the shape, so they get
// access to the mutable reference to alter the shape.
Shape & shape() { return m_shape; };
private:
Shape m_shape;
Color m_color;
};
void someFunction(Geometry & g)
{
std::cout << g.shape().area << std::endl;
}
int main ()
{
Geometry g1;
someFunction(g1);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgQ29sb3IgPSBpbnQ7CnN0cnVjdCBTaGFwZQp7CiAgZG91YmxlIGFyZWEgPSAwOwp9OwoKY2xhc3MgR2VvbWV0cnkKewpwdWJsaWM6CiAgLy8gZXZlcnlib2R5IGNhbiBhbHRlciB0aGUgY29sb3Igb2YgdGhlIGdlb21ldHJ5LCBzbyAKICAvLyB0aGV5IGdldCBhIG11dGFibGUgcmVmZXJlbmNlCiAgQ29sb3ImIGNvbG9yKCkgeyByZXR1cm4gbV9jb2xvcjsgfTsKCiAgLy8gbm90IGV2ZXJ5Ym9keSBjYW4gYWx0ZXIgdGhlIHNoYXBlIG9mIHRoZSBHZW9tZXRyeSwgc28KICAvLyB0aGV5IGdldCBhIGNvbnN0YW50IHJlZmVyZW5jZSB0byB0aGUgc2hhcGUuCiAgU2hhcGUgY29uc3QmIHNoYXBlKCkgY29uc3QgeyByZXR1cm4gbV9zaGFwZTsgfTsKCnByb3RlY3RlZDoKICAvLyBkZXJpdmVkIGNsYXNzZXMgY2FuIGFsdGVyIHRoZSBzaGFwZSwgc28gdGhleSBnZXQgCiAgLy8gYWNjZXNzIHRvIHRoZSBtdXRhYmxlIHJlZmVyZW5jZSB0byBhbHRlciB0aGUgc2hhcGUuCiAgU2hhcGUgJiBzaGFwZSgpIHsgcmV0dXJuIG1fc2hhcGU7IH07Cgpwcml2YXRlOgogIFNoYXBlIG1fc2hhcGU7CiAgQ29sb3IgbV9jb2xvcjsKfTsKCgp2b2lkIHNvbWVGdW5jdGlvbihHZW9tZXRyeSAmIGcpCnsKICBzdGQ6OmNvdXQgPDwgZy5zaGFwZSgpLmFyZWEgPDwgc3RkOjplbmRsOwp9CgppbnQgbWFpbiAoKQp7CiAgR2VvbWV0cnkgZzE7CiAgc29tZUZ1bmN0aW9uKGcxKTsKICByZXR1cm4gMDsKfQ==