오버로드 연산자 << C ++ 클래스 내에서
-
05-07-2019 - |
문제
구조물을 사용하는 클래스가 있으며 해당 구조물의 << 연산자에 과부하를주고 싶지만 클래스 내에서만 가능합니다.
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;
}
}