2014-09-09 3 views
0
typedef vector<int> intvec; 

class MyClass 
{ 
    intvec m_member; 
public: 
    const intvec& GetVec(); 
}; 

const intvec& MyClass::GetVec() 
{ 
    return m_member; 
} 

int main(int argc, char *argv[]) 
{ 
    MyClass myClassObj; 

    myClassObj.GetVec().push_back(11); //This doesn't work with const reference 
    myClassObj.GetVec().push_back(22); //This doesn't work with const reference 

    for(intvec::const_iterator iter = myClassObj.GetVec().begin(); iter != myClassObj.GetVec().end(); ++iter) 
    { 
     cout << *iter << ", " ; 
    } 

    cout << endl; 

    system("PAUSE"); 
    return EXIT_SUCCESS; 
} 

를 얻을 수 있지만, const를 참조 반환이 (컴파일 오류가) 작동하지 않습니다. GetVec() 메서드 자체가 즉, const intvec& GetVec() const; 인 경우 myClassObj.GetVec().push_back(11);은 "this"포인터를 수정한다는 의미이므로 작동하지 않습니다.반환 const를 참조 방법을

const intvec& GetVec() const; // Can access, but not modify, a const object 
intvec& GetVec();    // Can access or modify a non-const object 

또는 당신은 단지 데이터 멤버를 공개하고 정확히 같은 제한이있을 수 있습니다 : 그것은 const 자격의에

+1

push_back의 의미가 이름이 말하는 경우 const (참조)를 push_back 할 수 없습니다. 이는 push_back이 뒤로 밀려서 데이터 내용을 변경하기 때문입니다. – thang

답변

4

당신은 함수를 오버로드 할 수 있습니다. 접근 자 함수에는 액세스를 제한하거나 클래스 불변성을 유지하는 데 사용하지 않는 한 접근 자 함수에는 별다른 의미가 없습니다.

+0

왜'intvec & MyClass :: GetVec() const {return m_member;}'에러가 발생합니까? 오류 C2440 : '반환': 'const intvec'에서 'intvec'로 변환 할 수 없습니다.이 구현에서 잘못된 점은 무엇입니까? – ontherocks

+0

@ontherocks :'const' 멤버 함수는 모든 클래스 멤버에 대한 비 -const' 참조를 취할 수 없기 때문에. 그렇지 않으면 그것을하려고 시도 할 때 (간접적으로) 멤버를 수정하는 데 사용될 수 있습니다. –

1

push_back과 같은 수정 기능을 const 참조에서 사용할 수 없다는 것이 예상됩니다. push_back이 배열에 항목을 추가하는 것으로 가정하면 이는 객체에 대한 수정을 구성하므로 객체가 상수 인 인 경우에는 수정할 수 없습니다.