이 노출하는 더 많거나 적은 표준 방법 :
어쨌든 당신과 같이 쓸 수 있습니다 :
class Coord
{
public:
enum xyz {x = 0, y, z};
Coord() : vec{x, y, z} {}
template<xyz C> void set(double v) { vec[C] = v; }
template<xyz C> double get() const { return vec[C]; }
void set(double xx, double yy, double zz)
{
set<Coord::x>(xx);
set<Coord::y>(yy);
set<Coord::z>(zz);
}
private:
double vec[z + 1];
};
을하고 수업이 방법을 사용 non-const 접근기에서 변경 가능한 참조를 반환하고 const에서 값을 반환합니다. 이렇게하면 구문을 너무 무겁게 만들지 않고 인터페이스를 저장소에서 분리 할 수 있습니다.
private:
double m_x, m_y, m_z;
public:
double & x() { return m_x; }
double & y() { return m_y; }
double & z() { return m_z; }
double x() const { return m_x; }
double y() const { return m_y; }
double z() const { return m_z; }
이 c.x()
은의 값을 획득 할 수있는 X Coord
객체 CONST인지하고 c.x() = value
구문을 사용하여 값을 설정하는 허용 여부 좌표.완전성의 관심에서
, 당신은 다음과 같은 코드를 사용하여 정확히 원하는 구문을 얻을 수 있지만, 난 강력하게 반대 추천 할 것입니다. 그것은 많은 여분의 코드이고, 실질적인 이익을 제공하지 않으며, 흔치 않은 문법을 만들고 대부분의 프로그래머는 그것을 직관적으로 찾지 못할 것입니다.
이 기술은 두 개의 중첩 클래스 인 getters
과 setters
을 생성하고 이들의 인스턴스를 Coord
의 공용 멤버로 제공합니다.
이것은 요청한 결과를 얻는 방법의 예로서 제공되지만이 방법은 권장하지 않습니다.
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;
}
(Demo)
그렇게하지 마십시오! –
@KarolyHorvath 왜? 내 실제 수업이 더 좋다고 생각하니? – marquesm91
@KarolyHorvath 그 일을하지 않는 이유를 알려주십시오. – sfrehse