2016-07-28 18 views
2

У меня есть константа по методу ускорения, но я могу назвать метод мощности. Их способ фактически остановить это.Константа и указатели элементов

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

Есть ли причина, по которой вам нужен «Двигатель» вместо «Двигатель»? – NathanOliver

+0

Настоящий автомобиль будет содержать двигатель и не только укажет на один. –

ответ

2

Для метода Car метод const - это метод, который не изменяет Car переменных-членов.

так, до тех пор, пока Car::Accelerator не делает p указывает на другое место, оно действительно.

с p не изменен в Accelerator (это означает, что он не указывает на другой адрес памяти), программа действительна.

момент вы делаете p точку в другое место, программа не компилировать:

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

Защита от непогоды затрагивает только прямые элементы, в данном случае только указатель. Значения вне этого объекта (так называемые значения) не защищены.

Вы должны решить, считаете ли вы остроконечную ценность как себя или кого-то еще.

2

Вы можете изменить член Engine как const*, который сделает Engine объект, на который указывает p в Carconst:

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

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

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

Это больше не будет компилировать:

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(){ 
     ^

Но это означает, что ни один член Car не может изменить *p, что, вероятно, не то, что вы намереваетесь. См. Комментарий @ NathanOliver для лучшего ответа.

Надеюсь, это поможет.