2012-04-26 2 views
2

저는 클래스에 의해서만 수정 될 수있는 getter를 사용하지 않고 클래스 멤버를 가질 수있는 방법이 있는지 궁금해했습니다.클래스를 제외한 모든 사람들을위한 상수가 있습니까?

내가 생각하는 것은 이런 것입니다.

class A 
{ 
    public: 
     crazyconst int x; 

     void doStuff() 
     { 
      // Gettin' stuff done 
      x = someValue; // OK 
     } 
}; 

int main(int argc, char** argv) 
{ 
    A a; 
    a.x = 4; // ERROR 
} 

보이지 만 클래스 옆의 모든 사용자에게 읽기 전용입니다.

+1

'main'에서 int'y = a.x'가 합법적이어야 함을 의미합니까? 이 경우, 그렇지 않으면 당신은 "단지 사적으로 사용하라!"와 같이 많은 답변을 얻게 될 것이기 때문에 그렇게 말하십시오. – vsz

+0

몇 가지 이상한 언어가 그런 것 같지만 C/C++이 아닙니다. –

+0

에는 public int xMethod() {return x;}가 있고 x는 전용 멤버입니다. – Dhananjay

답변

4

대답은 당신이 어떤 종류의 게터 없이는 이것을 할 수 없다는 것입니다. 그러나 getter를 재사용 가능하게 만들 수 있고 괄호없이 필드 작업의 간단한 구문을 (대부분) 만들 수 있습니다.

(C++ 11 필수)

template<typename Friend, typename FieldType> 
class crazyconst 
{ 
    FieldType value; 
    friend Friend; 
    FieldType& operator=(const FieldType& newValue) { return value = newValue; } 
public: 
    operator FieldType(void) const { return value; } 
    FieldType operator()(void) const { return value; } 
}; 

class A 
{ 
public: 
    crazyconst<A, int> x; 

    void doStuff() 
    { 
     // Gettin' stuff done 
     x = 5; // OK 
    } 
}; 

int main(int argc, char** argv) 
{ 
    A a; 
    int b = a.x; 
    int c = a.x(); // also works 
} 

C++ 03 버전 : http://ideone.com/8T1Po

하지만 조심, 이것은 컴파일하지만 예상대로 작동하지 않습니다

const int& the_x = a.x; 
a.doStuff(); 
std::cout << the_x; 

OTOH, 괜찮을 것입니다 :

const auto& ref_x = a.x; 
a.doStuff(); 
std::cout << ref_x; 
+0

정확히이 솔루션을 C++ 11로 제한합니까? 감사! – guga

+1

@ guga : http://stackoverflow.com/a/702701/103167 –

6

클래스에 공개 const 개인용 비공개, const 데이터 멤버에 대한 참조가있을 수 있습니다.

편집 : 그러나이 작업을 수행하면 컴파일러에서 생성 한 복사본 생성자 및 복사 할당 연산자를 사용할 수 없게됩니다.

+1

'const_cast'에 대해 걱정하지 않는다면 좋은 접근 방법입니다. –

+0

@BenVoigt :이 특별한 경우에'const_cast'에 대해 걱정할 이유가 있습니까? –

+0

@Als, 주 :'const_cast (a.x) = 4;' – chris

관련 문제