2009-10-04 7 views
-1

여러 네임 스페이스 내에서 동일한 클래스 이름을 사용하면 문제가 발생합니까? 나 또한 수학 라이브러리에 의존성을 제거하려고합니다. 디자인을 따르는 것에 대해 어떻게 생각하십니까?클래스 이름 지정 및 네임 스페이스

첫 번째 파일

#define MATH_RECTANGLE_EXISTS 

namespace math { 

    class Rectangle : Object2D { 
    public: 
     float perimeter(); 
     float area(); 

     float x,y,w,h; 
    }; 
} 

다른 파일

#define GRAPHIC_RECTANGLE_EXISTS 

#ifndef MATH_RECTANGLE_EXISTS 
    //is this a good idea to remove dependency? 
    namespace math { 
     class Rectangle { 
     public: 
      float x,y,w,h; 
     } 
    } 
#endif 

namespace graphics { 

    class Rectangle : math::Rectangle { 
    public: 
     void Draw(Canvas &canvas); 

     void Translate(float x, float y); 
    }; 
} 

편집

무엇 종속성을 제거하는이 방법에 대한?

** 1 파일 **

namespace common { 
    class Rectangle { 
     float x,y,w,h; 
    }; 
} 

수학 LIB 파일

#define MATH_RECTANGLE_EXISTS 

namespace math { 

    class Rectangle : public common::Rectangle, public Object2D { 
    public: 
     float perimeter(); 
     float area(); 
    }; 
} 

그래픽 파일 미리

#define GRAPHIC_RECTANGLE_EXISTS 

namespace graphics { 

#ifndef MATH_RECTANGLE_EXISTS 
    class Rectangle : public math::Rectangle { 
#else 
    class Rectangle : public common::Rectangle { 
#endif 
    public: 
     void Draw(Canvas &canvas); 

     void Translate(float x, float y); 
    }; 
} 

감사합니다.

답변

3

동일한 식별자를 다른 네임 스페이스 내에서 재사용하면 문제가 발생하지 않습니다.

그러나 math :: Rectangle의 포함을 '시뮬레이트'하지 말 것을 강력히 권합니다. 파일을 필요로하지만 포함시키고 있지만 복사/붙여 넣기 프로그래밍이라고하는 것은 두 가지 코드가 동기화되지 않았기 때문에 많은 문제를 야기합니다. 따라서 버그 수정/기능 추가가 필요합니다. 다른쪽에는보고되지 않습니다.

편집 : 편집에 답) 그것은 코멘트에서 명확하지 않다

그래서 나는 그것을 언급합니다 :

당신이 정말로 당신에게, 제공하는 기능)를 사용하기 때문에 당신은 (의존성을해야하는 경우 헤더를 포함시켜야합니다. 반대로 상속을 사용하여 모서리가 4 개이고 메서드가 거의없는 무언가를 얻는 경우 최소한의 기능으로 새로운 Rectangle 클래스를 만드는 것이 좋습니다.

그러나 나는 엣지 경우를 생각할 수 있습니다. 나는 당신이 기능에 관심이 많지는 않지만 실제로 수학 라이브러리에서 math :: Rectangle을 매개 변수로 사용하도록 조정 된 메서드를 재사용 할 가능성에 관심이 있다는 인상하에 있습니다.

Herb Sutter (내가 생각하는 C++ 코딩 표준)에 따르면 클래스와 함께 번들로 제공되는 무료 함수는 클래스 공용 인터페이스의 일부입니다. 그래서 그 클래스들을 원한다면 실제로 상속이 필요합니다.


지금 나는 당신이 거대 할 수있는 라이브러리를 (내가 당신의 수학 라이브러리를 모르는)을 포함하여 약간의 거부감이있을 수 있음을 이해할 수있다.기본적인 모양과 그들에게 MathShapes을 포함하고
  • 수학 라이브러리를 작동 방법을 포함,

    • MathShapes 라이브러리를 다른 모든 물건을 추가 :이 경우에는 두 가지의 수학 라이브러리를 분할 고려할 수

    이렇게하면 MathShapes 라이브러리에만 의존하게됩니다.

    한편, 의존성을 절대적으로 원하지 않으면 무딘 복사/붙여 넣기를 수행 할 수 있지만 헤더 가드의 존재 여부를 테스트하여 Math :: Rectangle의 존재 여부를 테스트하는 솔루션은 좋지 않습니다. 장착 다음 실제로 전에 반드시이 그래픽 :: 사각형

  • 을의 포함을 수행 포함 할 경우 제대로
  • 를 헤더 가드를 얻을 경우

    • 을 그것은 단지 작동

      Graphics :: Rectangle이 Math :: Rectangle 앞에 포함되어있는 경우 몇 가지 컴파일 문제가있을 수 있습니다 ...

      종속성을 원하는지 여부를 결정하십시오.

  • +0

    예, 그렇습니다.하지만 두 라이브러리 간의 종속성을 원하지 않습니다. 존재하는 경우 해당 기능을 사용하고 싶습니다. –

    +0

    질문을 업데이트했습니다. 다시 확인하십시오. –

    +1

    그런 다음 일종의 인터페이스/팩토리를 사용해야합니다. 수학 라이브러리를 사용할 수있는 경우 구현을 가져올 수 있습니다. 그렇지 않으면 대체가 대신 사용됩니다. – sdg

    2

    네임 스페이스는 무엇을위한 것이며, 사각형은 수학적 개체와 그래픽 개체 둘 다입니다.

    그러나 헤더 파일을 포함시키지 않으려는 시도는 매우 바람직하지 않습니다. 그것은 유지 보수의 두통 이외에 아무것도 얻지 못합니다. math :: Rectangle 을 변경하면은 graphics :: Rectangle을 재 작성해야합니다. 불일치로 끝나고 컴파일러에서 숨기면 런타임 오류를 디버그하기가 어려워집니다.

    관련 문제