문제

구조물을 사용하는 클래스가 있으며 해당 구조물의 << 연산자에 과부하를주고 싶지만 클래스 내에서만 가능합니다.

typedef struct my_struct_t {
  int a;
  char c;
} my_struct;

class My_Class
{
  public:
    My_Class();
    friend ostream& operator<< (ostream& os, my_struct m);
}

친구 키워드가있는 연산자 << 오버로드를 선언 할 때만 컴파일 할 수 있지만, 수업뿐만 아니라 오퍼레이터가 내 코드의 모든 곳에서 과부하됩니다. 클래스 내에서만 my_struct의 << 연산자를 과부하하려면 어떻게해야합니까?

편집 : 오버로드 된 연산자를 사용하여 my_class의 멤버 인 my_struct를 인쇄하고 싶습니다.

도움이 되었습니까?

해결책

클래스 내에서만 my_struct의 << 연산자를 과부하하려면 어떻게해야합니까?

그것을 정의하십시오

static std::ostream & operator<<( std::ostream & o, const my_struct & s ) { //...

또는

namespace {
    std::ostream & operator<<( std::ostream & o, const my_struct & s ) { //...
}

에서 .cpp 구현하는 파일 MyClass.

편집하다: 당신이 정말로, 실제로 클래스에 대한 범위와 다른 것은 없다면, 해당 클래스에서 개인 정적 함수로 정의하십시오. 그것은 해당 클래스에서만 범위에 있으며 서브 클래스입니다. 다른 모든 관습을 숨길 것입니다 operator<<'ADL에서 찾을 수 없거나 회원이 아닌 한 관련없는 클래스 (다시 클래스 내부 및 하위 클래스)에 대해 정의되었습니다. std::ostream 이미.

다른 팁

연산자를 사용하지 마십시오 <<. 명명 된 멤버 함수를 사용하고 비공개로 만드십시오.

class My_Class
{
  public:
    My_Class();
 private:
    void Print( ostream & os, const my_struct & m );
};

참고 구조를 Const 참조로 전달해야합니다.

편집하다: 연산자 << 클래스 멤버를 클래스 멤버를 인쇄 할 수 있도록 연산자 << 클래스 멤버를 만들 필요는 없습니다. 당신은 그것을 구조물의 친구 또는 완전 자유 함수로 만들 수 있으며, 수업이 사용합니다.

"my_class에 과부하 만하는"이라면 내 클래스에서만 눈에 띄는 / ossable을 의미한다면 My_Class에만 보이는 비회원 오버로드를 사용할 수 있습니다. 예를 들어

   struct my_struct {
      int a;
      char c;
   };

   class My_Class
   {
      publiC:
         My_Class();
   }

그런 다음 my_class.cpp에서 :

namespace {
    ostream& operator(ostream& os, const my_struct& mystruct ) {
         os << mystruct.a << mystruct.c;
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top