이 매크로는 일부 글로벌 헤더에서 또는 컴파일러 명령 행 매개 변수로 정의 할 수 있습니다.
#define me (*this)
그리고 일부 사용 예 :
some_header.h :
inline void Update()
{
/* ... */
}
main.cpp :
#include "some_header.h"
class A {
public:
void SetX(int x)
{
me.x = x;
me.Update();
}
void SomeOtherFunction()
{
::Update();
}
/*
100 or more lines
...
*/
void Update()
{
// ...
}
int x;
};
따라서 클래스 멤버에 액세스 할 때 클래스 메서드에서 항상을 사용 me하고 전역 식별자에 액세스 할 때 항상을 사용 ::합니다. 이것은 코드에 익숙하지 않은 독자에게 (어쩌면 몇 달 후에 나 자신에게) 다른 곳을 볼 필요없이 액세스 된 것에 대한 현지화 된 정보를 제공합니다. 모든 곳에서 너무 시끄럽고 못생긴 me것을 사용하기 때문에 정의하고 싶습니다 this->. 그러나 #define me (*this)좋은 C ++ 연습으로 간주 될 수 있습니까? me매크로에 실용적인 문제가 있습니까? 그리고 C ++ 프로그래머로서 me매크로를 사용하는 일부 코드의 독자가 된다면 그것을 원하십니까?
편집 : 많은 사람들이을 사용하여 구체적으로 대조를 주장하지는 me않지만 일반적으로 이것을 명시 적으로 대조합니다. "이 곳 어디에서나 명시 적"의 이점이 무엇인지 명확하지 않을 수 있습니다.
"이 곳 어디에서나 명시 적"의 이점은 무엇입니까?
- 코드의 독자로서 당신은 무엇을 액세스했는지 확실하게 알고 있으며, 먼 코드에서 확인과는 다른 것에 집중할 수 있습니다.
- 보다 구체적으로 검색 기능을 사용할 수 있습니다. "검색
this->x"만 검색보다 더 많은 원하는 결과를 얻을 수 있습니다 "x" - 일부 멤버를 삭제하거나 이름을 바꾸는 경우 컴파일러는이 멤버가 사용되는 위치를 확실하게 알려줍니다. (일부 전역 함수는 동일한 이름을 가질 수 있으며 명시 적으로 사용하지 않으면 오류가 발생할 수 있습니다.)
- 코드를 리팩토링하고 멤버에서 멤버가 아닌 함수를 명시 적으로 만들 때 (더 나은 캡슐화를 위해) 이것은 편집해야하는 위치를 나타내며이를 멤버가 아닌 함수 매개 변수로 제공된 클래스의 인스턴스에 대한 포인터로 쉽게 바꿀 수 있습니다.
- 일반적으로 코드를 변경하는 경우 명시 적으로 이것을 사용하지 않을 때 어디서나 명시 적으로 사용하는 경우보다 오류가 발생할 가능성이 더 큽니다.
- 명시 적으로 이것은 외부에서
object.membervs. 멤버를 액세스 할 때 명시 적 "m_"보다 덜 시끄 럽습니다 (object.m_member이 지점을 발견하기 위해 @Kaz 덕분에) - 명시 적으로 이것은 모든 멤버 (속성 및 메소드)에 대한 보편적 문제를 해결하는 반면, "m_"또는 다른 접두어는 속성에만 실용적으로 사용할 수 있습니다.
이 목록을 다듬고 확장하고 다른 장점과 사용 사례를 알고 있다면 어디에서나 명시 적으로 알려주십시오 .
#define self (*this)됩니까? 당신은 할 수 있습니다 모두 매크로를 혼합 하고 VB 등 파이썬을 모방 일부 파일이 있습니다. :)
me_x있습니다.