5. Name Lookup, Namespaces, and the Interface Principle

31. Name Lookup and the Interface Principle-Part 1

다음 중 어떤 함수가 호출되는가?

namespace A 
{
  struct X;
  struct Y;
  void f( int );
  void g( X );
}

namespace B
{
  void f( int i )
  {
    f( i );   // which f()?
  }
  void g( A::X x )
  {
    g( x );   // which g()?
  }
  void h( A::Y y )
  {
    h( y );   // which h()?
  }
}

f는 자신을 무한 호출한다. g는 호출이 불명확하므로 컴파일되지 않는다. h는 자신을 무한 호출한다.

32. Name Lookup and the Interface Principle-Part 2

클래스 부분과 인터페이스 부분의 차이는? 클래스 X에 대해 X를 언급하거나 X에 의해 공급되는 함수들은 논리적으로 X의 부분이며 X의 인터페이스의 일부분이다.

33. Name Lookup and the Interface Principle-Part 3

operator<<를 어떻게 써야 하는가? 클래스 X에 대해 X를 언급하거나 X에 의해 공급되는 함수들은 논리적으로 X의 부분이며 X의 인터페이스의 일부분이다. 그러므로 멤버와 비멤버 함수는 논리적으로 클래스의 일부분이다. 멤버 함수가 더 강하게 연결되어 있을 뿐이다. X에 의해 공급되는 함수는 같은 네임스페이스나 헤더에 놓는 것이 좋다.

34. Name Lookup and the Interface Principle-Part 4

아래 코드의 문제는?

// Example 2: Will this compile? 
//
// In some library header:
namespace N { class C {}; }
int operator+(int i, N::C) { return i+1; }
// A mainline to exercise it:
#include <numeric>
int main()
{
  N::C a[10];
  std::accumulate(a, a+10, 0);
}

이름 숨김 때문에 제대로 동작하지 않는다. 정답은 다음과 같다.

// Example 2b: Solution 
//
// in some library header
namespace N
{
  class C {};
  int operator+(int i, N::C) { return i+1; }
}
// a mainline to exercise it
#include <numeric>
int main()
{
  N::C a[10];
  std::accumulate(a, a+10, 0); // now ok
}

네임스페이스를 현명하게 사용하라. 네임스페이스 N 내에서 클래스를 쓰면, 모든 헬퍼 함수나 연산자 또한 N 안에 넣어야 한다. 아니면 이상한 결과가 벌어질 수 있다.

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중