답변 번역
Private members들은 오직 그것들을 정의하는 클래스 내에서만 접근 가능하다.
Protected members들은 그것들의 정의하는 클래스와, 그 클래스로부터 상속받는 클래스에서 접근가능하다.
Edit : 둘 다 그것들의 클래스의 friends에 의해 접근가능하다. 그리고 protected members의경우에, 그것들의 파생된 클래스의 friends에 의해서도 접근 가능하다.
Edit 2 : 너의 문제 상황에서 말이되는 무엇이든 사용해라. 너는 중복을 줄이고, base class의구현을 보호하기위해 너가 할 수 있을 때 마다 members들을 private으로 하려고 노력해라. 그러나 만약 그것이 가능하지 않다면, 그러면 protected members를 써라.
이것에 대한 예시는 다음과 같다.
이것은 내가 코딩을 하면서 느낀 것인데,
class ParticleAnchoredSpring : public ParticleForceGenerator { glm::vec3* anchor; real springConstant; real restLength; public: ParticleAnchoredSpring(glm::vec3* anchor, real springConstant, real restLength); virtual void updateForce(GPEDParticle* particle, real duration); const glm::vec3* getAnchor() const { return anchor; } };
위의 클래스에서 anchor, springConstant, restLength는 private member이다.
class ParticleAnchoredBungee : public ParticleAnchoredSpring { public: virtual void updateForce(GPEDParticle* particle, real duration); };
그리고 ParticleAnchoredBungee라는 클래스는 ParticleAnchoredSpring으로부터 상속받았다. 참고로 updateForce는 pure virtual function으로 설정되어 있는 것이다.
그리고 ParticleAnchoredBungee::updateForce는 다음과 같이 구현된다.
void GPED::ParticleAnchoredBungee::updateForce(GPEDParticle * particle, real duration) { // Calculate the vector of the spring. glm::vec3 force = particle->getPosition(); force -= *anchor; // Calculate the magnitude of the force real magnitude = glm::length(force); if (magnitude < restLength) return; magnitude = magnitude - restLength; magnitude *= springConstant; // Calculate the final force and apply it force = glm::normalize(force); force *= -magnitude; particle->addForce(force); }
여기에서 anchor, restLength, springConstant는 모두 ParticleAnchoredSpring에 있는 private member로서 이 상태에서는 저 변수에 접근이 불가능하다. ParticleAnchoredSrping이 public으로 ParticleAnchoredBungee에 상속되었을지라도, 그 세 가지 변수들이 private member이기 때문이다.
그러나
class ParticleAnchoredSpring : public ParticleForceGenerator { protected: /** The location of the anchored end of the spring*/ glm::vec3* anchor; /** Holds the spring constant. */ real springConstant; /** Holds the rest length of the spring. */ real restLength; public: /** Creates a new spring with the given parameters. */ ParticleAnchoredSpring(glm::vec3* anchor, real springConstant, real restLength); /** Applies the spring force to the given particle*/ virtual void updateForce(GPEDParticle* particle, real duration); /** Retrieve the anchor point. */ const glm::vec3* getAnchor() const { return anchor; } };
이 처럼 그 private member들을 protected로 바꿔주면, 위의 updateForce함수에서 접근이 가능해진다.
따라서 protected는 상속받은 클래스, 게다가 그런 상속된 클래스의 friends들까지도 접근가능하게 해준다.
댓글 없음:
댓글 쓰기