правильность - PullRequest
       4

правильность

1 голос
/ 03 июня 2010

Я проходил: Часто задаваемые вопросы по C ++ о наследовании и решил реализовать его (только для изучения)

#include "Shape.h"

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

теперь все (ну, почти) работает так, как описано в item: faq: 23.1, за исключением того, что print () является const, и поэтому он не может получить доступ к указателю "this", как только вы берете const, он работает , Теперь часто задаваемые вопросы по C ++ существуют довольно давно и обычно довольно хороши. Это ошибка? У них опечатка или я не прав? Если я ошибаюсь, я хотел бы знать, как можно получить доступ к указателю "this" в функции const.

Ответы [ 5 ]

18 голосов
/ 03 июня 2010

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

8 голосов
/ 03 июня 2010

Почему нельзя 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
}
1 голос
/ 04 июня 2010

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

1 голос
/ 03 июня 2010

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

0 голосов
/ 03 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...