2011-04-06 3 views
1

class Address을 구현하고자 할 때, 생성시 해당 필드 addr을 고유 한 값으로 초기화합니다. 이 값은 Address 인스턴스를 만들 때마다 1 씩 증가해야합니다."기이하게 반복되는 템플릿 패턴"을 사용하는 증분 번호

예를 들어 보겠습니다. 다음 코드가 실행 된 후 : y.addr 2.

가를 달성하기 위해해야하는 동안

Address x; 
Address y; 

x.addr 1이어야한다, 나는 Curiously Recurring Template Pattern의 생각했다. 그것은 가능할 것인가? 또한 동일한 동작을 수행하는 더 간단한 방법이 있습니까? 당신은 객체의 파괴를 캡처 할 필요가 없기 때문에

TIA, JIR은

답변

7

당신은 정말, 여기 필요하지 않습니다. 이 기본 클래스이기 때문에 소멸자가 (멤버라고,

  1. : CRTP 두 가지 편리한 기능을 가지고 있습니다 그래서 위키 백과 페이지의 예는, 유형의 존재 얼마나 많은 개체의 누적 합계를 유지하는 것이 당신은 알게 될 것이다 이 또한 달성 할 것이다).
  2. 파생 클래스 유형에 템플릿이 포함되어 있기 때문에 여러 상속을 사용하여 각자 자신의 CRTP 기반을 포함하고 많은 코드를 작성하지 않으면 계층 구조의 여러 클래스를 포함하여 각 클래스에 대해 별도의 카운터가 상속됩니다. 각 클래스. 당신은 단지 하나의 클래스의 각 구성원에 대해 고유 한 값을 원하는 경우에

, 다음 스레드 안전 제쳐두고 당신이 이런 식으로 작업을 수행 할 수 있습니다

int get_id() { 
    static int counter = 0; 
    return ++counter; 
} 

class Address { 
    int addr; 
    public: 
    Address() : addr(get_id()) {} 
}; 

을 CRTP 예에 따라, 당신은 get_id을 템플릿 수 추적 할 다중 클래스가 있고 각 클래스가 자신의 ID 공간을 갖기를 원하면 Address을 인수로 사용하십시오.

그리고이 사용 사례의 경우 CRTP를 사용하면 데이터 멤버를 템플릿 기본 클래스에 넣을 수 있습니다. 클래스를 많이 사용하는 경우에는 이점이 있습니다. 각 클래스에 대해 입력하기가 적기 때문에 그것 :

template <typename Derived> 
class unique_addr { 
    protected: 
    int addr; 
    unique_addr() : addr(get_id<Derived>()) {} 
}; 

class Address : public unique_addr<Address> { 
}; 

class OtherAddress : public unique_addr<OtherAddress> { 
}; 
+2

+1, 그리고'get_id' 더욱 구현의 세부를 만드는 클래스의 개인 정적 함수가 될 수 있습니다. 표시된 솔루션은 스레드로부터 안전하지 않으므로 다중 스레드 환경에서 실행하는 경우주의하십시오. –

+0

명확하고 완전한 설명! 고마워요! – Jir

1

그것은 당신이하려고하는 것에 대해 과도한 것처럼 보입니다. 고유 한 값만 필요하면 정적 정수를 사용하고 객체를 인스턴스화 할 때마다 증가시킵니다. 그런 다음 인스턴스 별 (즉, 비 정적) 변수를 해당 값으로 설정하십시오.

0

물론, 당신이 참조한 Wikipedia 기사에 표시된 것과 똑같이 할 수 있습니다. (dtor에서 카운터를 감소시키려는 것처럼 들리는 것을 제외하고는) 또는 Address 클래스에만 필요하면 CRTP 구현이 일회용으로 수행 할 수 있습니다.

static int n_addresses = 0; 
class Address { 
    int addr; 
    Address() { addr = ++n_addresses; } 
}; 

또는 이와 유사한 것.

0
public class Address 
{ 
    private static int addrCounter = 1; 

    public int addr { get; private set; } 

    public Address() 
    { 
     addr = addrCounter++; 
    } 
} 
0

당신은 클래스에 정적 카운터 내부 사용할 수 있습니다

class Address 
{ 
    static int s_Count; // define this variable in appropriate cpp file 
    int addr; 
public: 
    Address() : addr(++ s_Count) {} 
}; 
관련 문제