문제

다음 선언이 있다고 가정합니다.

class Over1
{
   protected:
      class Under1
      {
      };
};

다음을 수행 할 수 있다는 것을 알고 있습니다.

class Over2 : public Over1
{
   protected:
        class Under2 : public Under1
        {
        };
};

그러나 2 세 이상없이 미만을 선언하는 방법이 있습니까?

미만의 미분을 사용하기 위해 1 이상을 연장해야하기 때문에 이것은 어리석은 것처럼 보일 수 있지만,이 상황에서는 30 개의 다른 맛이있을 수 있습니다. 나는 둘 중 하나를 할 수있다 :

  • Over2가 1 ~ 2 개만 사용할 수 있으므로 매력적이지 않아서 모두 매력적이지 않습니다.
  • 그들 각각을 그들 자신의 버전에 넣으십시오. 그 이후로 매력적이지 않아서 거의 같은 클래스에서 상속을 곱해야합니다.
  • 1 세 이상의 자녀를 만들지 않고 1 세 미만의 자녀를 창조하는 방법을 찾으십시오.

그래서 이것이 가능합니까?

감사.

도움이 되었습니까?

해결책

템플릿과 명백한 전문화를 사용하면 1 이상의 추가 클래스 선언으로이를 수행 할 수 있습니다.

class Over1
{
protected:
  class Under1
  {
  };

  template <typename T>
  class UnderImplementor;
};

struct Under2Tag;
struct Under3Tag;
struct Under4Tag;

template <>
class Over1::UnderImplementor<Under2Tag> : public Over1::Under1
{
};

template <>
class Over1::UnderImplementor<Under3Tag> : public Over1::Under1
{
};

template <>
class Over1::UnderImplementor<Under4Tag> : public Over1::Under1
{
};

도움이 되었기를 바랍니다.

다른 팁

중첩 클래스를 만드는 것보다 더 나은 클래스를 네임 스페이스에 포함시키는 것을보고 싶을 수도 있습니다. 그렇게하면 내부 클래스를 얻기 위해 외부 클래스가 필요하지 않습니다. 그리고 Google C ++ 스타일 가이드.

1 이하 보호를 유지하려면 정의에 따라이를 접근하려면 Overs1에서 상속해야합니다. Douglas가 제안한대로 1 세 미만을 공개하거나 네임 스페이스를 사용하는 것이 좋습니다.

나는 지금 이것을 테스트 할 컴파일러가 없기 때문에 이것이 효과가있을 것이라고 확신하지는 않지만 이것을 시도 할 수 있습니다.

class Over1
{
   protected:
      class Under1
      {
      };

   public:
      class Under1Interface : public Under1 
      {
      };
};

class Under2 : public Over1::Under1Interface
{
};

또는 아마도 다음과 같은 것 :

class Over1
{
   protected:
      class Under1
      {
      };
};

class Under2 : private Over1, public Over1::Under1
{
};

또는:

class Under2;

class Over1
{
   friend class Under2;

   protected:
      class Under1
      {
      };
};

class Under2 : public Over1::Under1
{
};

비록 그것이 모든 1 명 이상의 개인을 2 위에 노출시킬 것이지만, 당신이 원하는 것이 아닐 수도 있습니다.

나에게 약간 펑키 한 디자인처럼 들린다. 코드를 다르게 구조화 해보십시오. 나는 이것이 데코레이터 패턴의 좋은 후보 일 수 있다고 생각합니다. 여기서 다양한 데코레이터로 기본 클래스를 감싸서 원하는 기능을 달성 할 수 있습니다. 코드의 의도에 대해 더 많이 알지 못하고 말하기 어렵습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top