2010-06-03 2 views
1

Я шел через: C++ FAQs about inheritance и решил реализовать его (просто, чтобы узнать его)сопзЬ правильность

#include "Shape.h" 

void Shape::print() const 
{ 
    float a = this->area(); // area() is pure virtual 
    ... 
} 

сейчас, все (ну, почти) работает, как описано в пункте: FAQ: 23,1 исключением того, что печать () является const, и поэтому он не может получить доступ к этому «указателю», как только вы выберете const, он работает. Теперь часто задаваемые вопросы по C++ существуют и обычно довольно хороши. Это ошибка? У них есть опечатка или я не прав? Если я ошибаюсь, я хотел бы знать, как можно получить доступ к «этому» указателю в функции const.

+0

Из любопытства, какой компилятор вы используете? –

+1

Учитывая выбор между мной, возможно, неправильным пониманием или почти 20-летней давней ссылкой, имеющей ошибку или опечатку в тривиальном случае, я склонен подозревать, что я могу что-то упустить. – JohnMcG

+1

Кстати, сохраните время ввода и воздержитесь от 'this->'. Он не нужен в C++. * Возможно, остаточная черта от Java? * –

ответ

18

Проблема в том, что функция area() не является константой. Если эта функция была const, тогда она будет компилироваться штрафом. Поскольку ваша внутренняя функция const, этот указатель const, и поэтому вы можете вызывать на нем только функции const.

8

Почему не удалось получить доступ к this? Дело в том, что могут использоваться только члены и методы const. Так что если Shape::area() объявлен const, проблем нет. Кроме того, вы можете свободно читать значение членов данных, но не приписывать им:

class Shape 
{ 
    int i; 
    void print() const; 
    virtual float area() const = 0; 
    virtual void modify() = 0; 
}; 

void Shape::print() const 
{ 
    float a = this->area(); // call to const member - fine 
    int j = this->i;  // reading const member - fine 

    this->modify();   // call to non const member - error 
    this->i++;    // assigning to member - error 
} 
+0

Вы правы. Я на самом деле понял это после того, как набрал вопрос, но приму ответ и уйду, чтобы другие узнали. – ra170

1

Если print определяются как const, то он может использовать this для доступа const пользователей, но не для доступа к неконстантным пользователям: так может вызывать this->area() if-and-only-если метод area объявлен как const (т. Е. Если метод area обещает, что при его вызове он не будет мутировать его экземпляр Shape).

0

Вы, безусловно, можете получить доступ к указателю this, но в функции const он станет указателем на объект const. Помните, что указатель this не является реальным экземпляром указателя, поэтому он может изменять свой тип в разных точках программы.

1

Это также хорошая практика, чтобы объявить все функции как const по умолчанию и только не делать этого, когда вам действительно нужно изменить объект. Это также поможет найти ошибки в том виде, в котором какая-то функция изменяет то, что она не предназначена.

Смежные вопросы