2016-07-28 3 views
2

Accelerate 메서드에 const가 있지만 전원 메서드를 호출 할 수 있습니다. 실제로 이것을 막을 수있는 방법입니까?const 정확도 및 멤버 포인터

class Engine{ 
public: 
    void Power(){ 
    } 
}; 

class Car{ 
public: 
    Car() : p(new Engine()){} 

    void Accelerator() const{ 
     p->Power(); 
    } 
    private: 
     Engine* p; 
}; 
+0

당신의'Engine' 포인터가'const'하지가 가리키는하는 일이기 때문입니다. – AndyG

+1

'Engine'대신 'Engine *'이 필요한 이유가 있습니까? – NathanOliver

+0

실제 차량에는 엔진이 포함되어있을뿐 아니라 하나를 가리킬 수 있습니다. –

답변

2

Car의 경우 const 메서드는 Car 개의 멤버 변수를 수정하지 않는 메서드입니다.

따라서 Car::Accelerator이 다른 위치를 가리 키지 않는 한 p은 유효합니다.

Accelerator에서 p이 수정되지 않았으므로 (다른 메모리 주소를 나타내지 않음을 의미) 프로그램이 유효합니다.

순간

가 다른 위치에 p 점을, 프로그램은 컴파일에 실패 :

void Accelerator() const { 
     p= nullptr; //wrong 
    } 
2

Const 보호는 직접 멤버 (이 경우 포인터 만)에만 영향을줍니다. 이 객체 외부의 값 (뾰족한 값)은 보호되지 않습니다.

뾰족한 값을 자신이나 다른 사람으로 간주할지 결정해야합니다.

2

당신은 Engine 개체가 Carconst에 의해 p을 지적 할 것이다 회원 Engineconst* 등을 수정할 수 있습니다

test_const.cpp:12:9: error: member function 'Power' not viable: 'this' argument 
     has type 'const Engine', but function is not marked const 
     p->Power(); 
     ^
test_const.cpp:3:10: note: 'Power' declared here 
    void Power(){ 
     ^

을하지만이 의미 :

class Engine{ 
public: 
    void Power(){ 
    } 
}; 

class Car{ 
public: 
    Car() : p(new Engine()){} 

    void Accelerator() const{ 
     p->Power(); 
    } 
private: 
    Engine const* p; 
}; 

이 더 이상 컴파일되지 않습니다 Car의 구성원이 *p을 수정할 수 없다는 것은 사용자가 의도하지 않은 것일 수 있습니다. 더 나은 답변을 원한다면 @ NathanOliver의 의견을 참조하십시오.

희망이 도움이됩니다.