#include <iostream>

class Coord
{
private:
	double x, y, z;
	
public:
	Coord();
	Coord(double, double, double);
	
	class setters {
		friend class Coord;
		
	private:
		explicit setters(Coord &);
		
	public:
		setters(setters const &) = delete;
		setters & operator=(setters const &) = delete;
		
		void x(double) const;
		void y(double) const;
		void z(double) const;
		
	private:
		Coord & coord;
	};
	friend class setters;
	
	class getters {
		friend class Coord;
		
	private:
		explicit getters(Coord const &);
		
	public:
		getters(getters const &) = delete;
		getters & operator=(getters const &) = delete;
		
		double x() const;
		double y() const;
		double z() const;
		
	private:
		Coord const & coord;
	};
	friend class getters;
	
	setters const set;
	getters const get;
};

Coord::Coord() : x(0), y(0), z(0), set(*this), get(*this) { }

Coord::Coord(double px, double py, double pz) : x(px), y(py), z(pz), set(*this), get(*this) { }

Coord::setters::setters(Coord & c) : coord(c) { }

void Coord::setters::x(double px) const {
	coord.x = px;
}

void Coord::setters::y(double py) const {
	coord.y = py;
}

void Coord::setters::z(double pz) const {
	coord.z = pz;
}

Coord::getters::getters(Coord const & c) : coord(c) { }

double Coord::getters::x() const {
	return coord.x;
}

double Coord::getters::y() const {
	return coord.y;
}

double Coord::getters::z() const {
	return coord.z;
}

int main() {
	Coord a(1,2,3);
	
	std::cout << a.get.x() << ' ' << a.get.y() << ' ' << a.get.z() << std::endl;
	
	a.set.x(5);
	a.set.y(6);
	a.set.z(7);
	
	std::cout << a.get.x() << ' ' << a.get.y() << ' ' << a.get.z() << std::endl;
	
	return 0;
}