Post Lists

2018년 9월 4일 화요일

C++ private과 protected의 차이

https://stackoverflow.com/questions/224966/private-and-protected-members-c

답변 번역
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들까지도 접근가능하게 해준다.

댓글 없음:

댓글 쓰기