중복 일 가능성이 있지만 검색하기 쉽지는 않습니다.
다음과 같은 헤더가 주어집니다.
namespace ns1
{
class MyClass
{
void method();
};
}
method()
.cpp 파일에서 여러 가지 방법으로 정의 된 것을 보았습니다 .
버전 1 :
namespace ns1
{
void MyClass::method()
{
...
}
}
버전 2 :
using namespace ns1;
void MyClass::method()
{
...
}
버전 3 :
void ns1::MyClass::method()
{
...
}
‘올바른’방법이 있습니까? 모두 같은 의미가 아니라는 점에서 ‘잘못된’것이 있습니까?
답변
버전 2는 명확하지 않고 이해하기 쉽지 않습니다. 어떤 네임 스페이스가 MyClass
속 하는지 모르고 비논리적 이기 때문입니다 (같은 네임 스페이스에없는 클래스 함수?).
버전 1은 네임 스페이스에서 함수를 정의하고 있음을 보여주기 때문에 옳습니다.
버전 3은 또한 ::
범위 확인 연산자를 사용 MyClass::method ()
하여 네임 스페이스에서 참조 했기 때문에 옳습니다 ns1
. 버전 3을 선호합니다.
네임 스페이스 (C ++)를 참조하십시오 . 이것이 가장 좋은 방법입니다.
답변
5 년 후 나는 이것을 언급 할 것이라고 생각했는데, 둘 다 멋지고 악하지 않다.
using ns1::MyClass;
void MyClass::method()
{
// ...
}
답변
버전 4 (아래)는 버전 1 (반사 정의의 간결함)과 버전 3 (최대한 명시 적)의 장점을 결합하기 때문에 사용하고 있습니다. 가장 큰 단점은 사람들이 그것에 익숙하지 않지만 내가 신경 쓰지 않는 대안보다 기술적으로 우월하다고 생각하기 때문입니다.
버전 4 : 네임 스페이스 별칭을 사용하여 전체 검증 사용 :
#include "my-header.hpp"
namespace OI = outer::inner;
void OI::Obj::method() {
...
}
내 세계에서는 모든 것이 명시 적으로 규정되어 있기 때문에 네임 스페이스 별칭을 자주 사용하고 있습니다. 그렇지 않은 경우 (예 : 변수 이름) 또는 알려진 사용자 지정 지점 (예 : 함수 템플릿의 swap ())이 아닌 경우입니다.
답변
버전 3은 더 많은 타이핑 대신 클래스와 네임 스페이스 간의 연결을 매우 명시 적으로 만듭니다. 버전 1은 이것을 피하지만 블록과의 연관성을 캡처합니다. 버전 2는 이것을 숨기는 경향이 있으므로 피하고 싶습니다.
답변
답변
나는 Num.3 (일명 verbose 버전)을 선택합니다. 더 많은 타이핑이지만 의도는 당신과 컴파일러에게 정확합니다. 있는 그대로 게시 한 문제는 실제로 실제보다 간단합니다. 실제 세계에는 클래스 멤버뿐만 아니라 정의에 대한 다른 범위가 있습니다. 정의는 클래스만으로는 그리 복잡하지 않습니다. 왜냐하면 그 범위는 다시 열리지 않기 때문입니다 (네임 스페이스, 전역 범위 등과 달리).
Num.1 이것은 다시 열 수있는 클래스 이외의 범위에서 실패 할 수 있습니다. 따라서이 접근 방식을 사용하여 네임 스페이스에 새 함수를 선언하거나 인라인이 ODR을 통해 대체 될 수 있습니다. 일부 정의 (특히 템플릿 전문화)에이 정보가 필요합니다.
Num.2 이것은 특히 대규모 코드베이스에서 매우 취약합니다. 헤더와 종속성이 이동하면 프로그램이 컴파일되지 않습니다.
Num.3 이것은 이상적이지만 입력해야 할 것이 많습니다 . 무엇 을 정의하려는 의도입니다 . 이것은 정확히 그것을 수행하고 컴파일러는 실수하지 않았는지, 정의가 선언과 동기화되지 않았는지 등을 확인하기 위해 시작됩니다.
답변
“코딩 스타일 문제”만이 아닙니다. Num. 2 헤더 파일에서 extern으로 선언 된 변수를 정의하고 초기화 할 때 연결 오류가 발생합니다. 내 질문의 예를 살펴보십시오. cpp 파일의 네임 스페이스 내 상수 정의