>백엔드 개발 >C++ >상속된 클래스 템플릿에서 멤버 비가시성 및 소스 코드 팽창을 방지하려면 어떻게 해야 합니까?

상속된 클래스 템플릿에서 멤버 비가시성 및 소스 코드 팽창을 방지하려면 어떻게 해야 합니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-01 05:38:27179검색

How Can I Avoid Member Invisibility and Source Code Bloat in Inherited Class Templates?

상속된 클래스 템플릿을 사용하여 멤버 숨김 및 소스 코드 과대화 방지

클래스 템플릿 CDerived가 기본에서 상속할 때 발생하는 문제가 발생합니다. 클래스 템플릿, CBase 및 CBase의 모든 공용 멤버는 표준 C 규격을 활성화하여 코드를 컴파일하면 CDerived에 표시되지 않습니다.

문제 해결 방법:

해결책 #1: 명시적 한정

CBase::를 사용하여 CDerived에서 CBase 멤버에 대한 접두사 참조는 Fn1()이 CBase::Fn1()이 됩니다. 이렇게 하면 기본 클래스 범위에서 이름 조회가 발생하여 멤버가 표시됩니다. 그러나 이 솔루션을 사용하려면 코드에 장황한 추가 내용이 많이 필요하므로 소스 코드가 너무 커집니다.

해결책 #2: this-> 접두사

CBase 멤버에 대한 참조 접두사에 this->가 붙습니다. 예를 들어 Fn1()은 this->Fn1()이 됩니다. 이렇게 하면 멤버도 표시되지만 다시 자세한 코드 변경이 필요합니다.

해결책 #3: 문 사용

CBase 멤버를 가져오려면 CDerived 내부에 using 문을 추가하세요. 예: CBase::Fn1을 사용합니다. CBase::Fn2;를 사용합니다. 이를 위해서는 CDerived에서 사용되는 멤버당 하나의 using 문만 필요하지만 모든 멤버를 가져오는 포괄적인 문은 존재하지 않습니다.

해결책 #4: 비표준 허용 모드

이름 조회 문제를 억제하려면 컴파일러 설정에서 엄격한 C 규칙을 비활성화합니다. 그러나 이는 표준에서 벗어난 글로벌 솔루션이며 이식성이 없습니다.

더 간결한 솔루션 #5:

솔루션의 장황함을 줄이기 위해 # 3, 매크로를 사용하여 필요한 using 문을 생성할 수 있습니다.

구현:

Boost 전처리기 라이브러리를 포함하고 USING_ONE 매크로를 정의하여 단일 using 문을 생성합니다. 특정 기본 멤버에 대한 문.

지정된 모든 기본 멤버에 대한 using 문 시퀀스를 생성하려면 또 다른 매크로 USING_ALL을 정의합니다.

기본 클래스 템플릿에서 USING_CBASE 매크로를 정의합니다. 파생 클래스 템플릿에서 사용될 모든 보호 및 공용 멤버에 대한 using 문을 생성합니다.

파생 클래스 템플릿 내에서 적절한 USING_CBASE 매크로를 사용하여 앞서 정의한 매크로를 사용하여 필요한 멤버를 가져옵니다. 이 프로세스에는 최소한의 검색 및 입력이 필요하므로 이식성을 유지하면서 소스 코드의 팽창을 줄입니다.

위 내용은 상속된 클래스 템플릿에서 멤버 비가시성 및 소스 코드 팽창을 방지하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.