2011-08-18 3 views
2

C++에 해당하는 Python 속성이 있습니까? 또는 게터와 세터를 사용하여이 작업을 수행하는 것이 더 좋을까요?파이썬 속성에 해당하는 C++

+0

내가 그것에 대해 잘 모르겠지만, 나는 당신이 파이썬의 속성을 에뮬레이트 할 수 있다고 생각 해요. 구현을 제한하는 데 사용되는 C++ 모의 템플릿 클래스 내에서 (편집을하기 전에 여기에 잘못된 오타가 있습니다.). 이 템플릿을 사용하여 형식을 강제하므로 잘못 사용하면 컴파일러 오류가 반환됩니다. 이 같은 python의 속성을 다시 만들어야합니다 :) –

답변

8

예, 명시 적 getter 및 setter는 C++에서 가장 가까운 구문입니다.

9

를 ++ 당신은 어느 쪽인지를 호출 멤버 함수있어, 또는 당신은 데이터 멤버에 접근하고 있습니다. 파이썬 속성은 근본적으로 후자의 구문을 사용하여 전자를 수행하는 방법이며 C++에서이를 수행하는 합리적인 방법은 없습니다.

이론상으로 매크로로 무언가를 해킹 할 수는 있지만, 어쩌면 꽤 좋지는 않을 것입니다. 또는 분별있는. 함수를 데이터처럼 보이게하는 유일한 이유는 이전의 호출 코드와의 호환성을 유지하는 것입니다. 하지만 C++에서는 바이너리 호환성을 제공하지 못하며 매크로가 이미 다른 컨텍스트에서 다른 이름으로 looks_like_data이라는 이름을 사용하는 호출 코드를 깨뜨리는 경우 소스 호환성을 제공하지도 않습니다. 그래서 요점은별로 없습니다.

당신이 할 수있는 또 다른 것은 데이터의 "논리적"유형에 대한 프록시 역할을하는 실제 데이터 멤버를 만드는 것입니다 :

struct Proxy { 
    Foo *foo; 
    Proxy(Foo *foo) : foo(foo) { } 
    operator int() const { 
     // getter code goes here, 
     // use (const Foo*)foo rather than foo 
    } 
    Proxy &operator=(int a) { 
     // setter code goes here 
    } 
    // optionally also implement boilerplate +=, -=, etc. 
}; 

struct Foo { 
    // optionally 
    // friend class Proxy; 
    Proxy looks_like_data; 
    Foo() : looks_like_data(this) { } 
}; 

이 거의 아니지만 꽤 합리적이다. 암시 적 변환을 사용하면 여전히은 소스 호환성을 손상시킵니다. 체인에 사용자 정의 암시 적 변환이 하나만있을 수 있기 때문에 발신자가 looks_like_data이 실제로 int이고 코드가 암시 적으로 변환 될 때 코드를 다시 작성한 경우 그 intBar로 변경하면 looks_like_dataProxy이되어 더 이상 암시 적으로 Bar으로 변환되지 않고 코드가 깨졌습니다.

결국 클래스에 읽기/쓰기 속성처럼 보이는 것이 필요한 경우 getter/setter 함수를 사용하는 것이 가장 좋습니다.

+0

아주 멋진 솔루션 –

관련 문제