Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Class method() const; const Class& method() const;


Автор: kemiisto 30.3.2009, 13:54
Пример:
Код

class Sphere3D: public Quadric3D
{
public:
  Sphere3D(const Point3D& centre, GLfloat radius, const Material3D& material);
  Point3D centre() const;             // первый вариант
  const Point3D& centre() const; // второй вариант
  GLfloat radius() const;
  void draw(Style style, Quality quality);
private:
  Point3D centre_;
  GLfloat radius_;
};


Вообщем нужен инспектор, а не мутатор. А вот как его объявить? 1 или 2? Тело этого метода тривиально:
Код

  return centre_;


Используется, например, в методах класса Point3D:
Код

bool Point3D::isInside(const Sphere3D& sphere) const
{
  if (sqrt(pow((x_ - sphere.centre().x_), 2) +
           pow((y_ - sphere.centre().y_), 2) +
           pow((z_ - sphere.centre().z_), 2)) <= sphere.radius())
    return true;
  else
    return false;
}


Работает и так и так. А есть ли разница?

P.S. Сильно не пинать. Я только начинаю... smile 

Автор: mes 30.3.2009, 14:47
2й вариант предпочтительнее, потому что не будет создавать дополнительных копий,
например при передачи в такую функцию void fn (const Point3D& )

Автор: kemiisto 30.3.2009, 15:05
Цитата(mes @  30.3.2009,  12:47 Найти цитируемый пост)
2й вариант предпочтительнее, потому что не будет создавать дополнительных копий,

mes, спасибо! 

А конструкции типа Class method() const; нужны, например, для того чтобы возвращать объект, созданный внутри метода?

Автор: Acer 30.3.2009, 15:09
const нужен для того, чтобы сказать компилятору, что твой метод не будет менять свойства экземпляра класса.

Автор: mes 30.3.2009, 15:12
Цитата(kemiisto @  30.3.2009,  14:05 Найти цитируемый пост)
А конструкции типа Class method() const; нужны, например, для того чтобы возвращать объект, созданный внутри метода? 

не только.. Тогда когда нужно отдать именно копию, а не ссылку на объект. Это нужно почувствовать, объяснить сложно smile

Добавлено через 57 секунд
Цитата(Acer @  30.3.2009,  14:09 Найти цитируемый пост)
const нужен для того, чтобы сказать компилятору, что твой метод не будет менять свойства экземпляра класса. 


Acer,  kemiisto не про этот const спрашивает smile

Автор: Acer 30.3.2009, 15:24
Цитата(kemiisto @ 30.3.2009,  14:05)
А конструкции типа Class method() const; нужны, например, для того чтобы возвращать объект, созданный внутри метода?

Такая конструкция вернет тебе копию обьекта Class

Автор: kemiisto 30.3.2009, 15:35
Цитата(mes @  30.3.2009,  13:12 Найти цитируемый пост)
Тогда когда нужно отдать именно копию, а не ссылку на объект. Это нужно почувствовать, объяснить сложно

Да... Чуточку прояснилось...

Автор: vinter 30.3.2009, 15:38
Цитата(kemiisto @  30.3.2009,  14:54 Найти цитируемый пост)
bool Point3D::isInside(const Sphere3D& sphere) const{  if (sqrt(pow((x_ - sphere.centre().x_), 2) +           pow((y_ - sphere.centre().y_), 2) +           pow((z_ - sphere.centre().z_), 2)) <= sphere.radius())    return true;  else    return false;}

это что за индокод? smile
Код

bool Point3D::isInside(const Sphere3D& sphere) const
{
      return sqrt(pow((x_ - sphere.centre().x_), 2) +
           pow((y_ - sphere.centre().y_), 2) +
           pow((z_ - sphere.centre().z_), 2)) <= sphere.radius(); 
}

Автор: baldina 30.3.2009, 15:39
Цитата

Это нужно почувствовать, объяснить сложно

Действительно бывают случаи, 
Цитата

когда нужно отдать именно копию, а не ссылку на объект

- когда объект временный (то, что упомянул kemiisto)
- когда думаешь про семантику, а не оптимизацию
- когда нужно отдать не константный объект, например имеющий нестандартную семантику присваивания

а вот представим ситуацию, когда значение Point используется в цикле:
Код

//вариант 1

Sphere s;
Point p = s.centre ();
for (...)
{
  // do something with point
}

Код

//вариант 2
Sphere s;
for (...)
{
  // do something with s.centre ();

}

есть разница? а теперь представим, что s. centre_ может измениться. в этом случае один из вариантов будет работать неправильно. какой именно - зависит от задачи

Автор: kemiisto 30.3.2009, 15:53
Цитата(vinter @  30.3.2009,  13:38 Найти цитируемый пост)
это что за индокод?

 smile бывает...

baldina, я даже что то понял, из того, что Вы сказали. smile Да, пойду дальше копаться...

Автор: mes 30.3.2009, 23:51
Цитата(vinter @  30.3.2009,  14:38 Найти цитируемый пост)
это что за индокод? smile

не слишком ли грубо за лишнeе использование "if" ?

Автор: vinter 31.3.2009, 07:50
Цитата(mes @  31.3.2009,  00:51 Найти цитируемый пост)
не слишком ли грубо за лишнeе использование "if" ?

нет
Код

bool f()
{
     if(a==b)
          return true;
      else
          return false;
}

это как раз пример индокода, одного из ярчайших его проявлений

Автор: baldina 31.3.2009, 09:57
 smile 
а меня, признаться, больше задел сам метод bool Point3D::isInside(const Sphere3D& sphere) const

получается, что класс Point3D должен знать обо всех типах, внутри которых может находиться точка.
логичнее bool isInside(const Point3D&, const Sphere3D& sphere) (эх, мультиметоды сюда бы)

да и реализация... pow... sqrt... гм... навела на размышления ;-)
почему не
Код

template <typename T>
inline 
T sqr (const T& x) 

   return x*x; 
}

bool isInside(const Point3D& point, const Sphere3D& sphere)
{
   return sqr(point.x_ - sphere.centre().x_) +
              sqr(point.y_ - sphere.centre().y_) +
              sqr(point.z_ - sphere.centre().z_) <= sqr (sphere.radius ());
}


Автор: kemiisto 31.3.2009, 10:14
Ещё раз спасибо всем за помощь. 

Но я попрошу воздержаться от комментариев не по теме. 
Во-первых, это только наброски. 
Во-вторых, 
Цитата(baldina @  31.3.2009,  07:57 Найти цитируемый пост)
логичнее
 это субъективная оценка. 
В-третьих, я не просил оценивать объектную модель.

Цитата(baldina @  31.3.2009,  07:57 Найти цитируемый пост)
получается, что класс Point3D должен знать обо всех типах, внутри которых может находиться точка.

baldina, есть ведь ещё базовый класс Primitive3D... Это же только набросок. Какой смысл обсуждать объектную иерархию без полноты картины. Я эту картину ещё и сам то не видел, а Вы...

Цитата(baldina @  31.3.2009,  07:57 Найти цитируемый пост)
почему не

А есть какая то принципиальная разница? smile 

Автор: Lazin 31.3.2009, 10:27
Цитата(kemiisto @  31.3.2009,  10:14 Найти цитируемый пост)
это субъективная оценка. 
В-третьих, я не просил оценивать объектную модель.

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

Автор: baldina 31.3.2009, 10:53
Цитата

А есть какая то принципиальная разница?

точность вычислений и быстродействие. не знаю, насколько это принципиально...  smile 

Автор: kemiisto 31.3.2009, 10:55
Цитата(Lazin @  31.3.2009,  08:27 Найти цитируемый пост)
очень даже объективная и правильная оценка

Хм... Это постулат такой? Тогда, если не трудно, автор, книга, страница.

Цитата(Lazin @  31.3.2009,  08:27 Найти цитируемый пост)
точка не должна знать о всех фигурах в которые она может попадать или нет, это объекты геом. фигур должны уметь определять, принадлежит им точка или нет, либо можно сделать это функцией

Lazin, функцией делать не хочеться. А вот сделать у каждого примитива метод определяющий принадлежность ему точки... Это мне больше по душе... Если вы настаиваете...

Автор: baldina 31.3.2009, 11:13
kemiisto, я не собирался обсуждать объектную модель; я допускаю, что в определенных условиях подобное решение имеет право на жизнь (но, поверьте, прочитав "набросок", ход мысли автора становится очень понятен).

а замечание носило общий характер: есть принцип в инженерии - чем меньше связей, тем надежнее система, тем проще её  сопровождать и модернизировать. в применении к классам C++ это означает, что следует стремиться их делать по возможности независимыми друг от друга.

хотите авторитетов? их есть у нас:
http://www.helloworld.ru/texts/comp/other/oop/index.htm
http://www.intuit.ru/department/se/ooad/

ничего личного smile

Автор: kemiisto 31.3.2009, 11:30
Цитата(baldina @  31.3.2009,  09:13 Найти цитируемый пост)
чем меньше связей, тем надежнее система, тем проще её  сопровождать и модернизировать.

Это да.

Цитата(baldina @  31.3.2009,  09:13 Найти цитируемый пост)

хотите авторитетов? их есть у нас:

Буча не перевариваю. А вот за Мейера спасибо. Не знал, что такое имеется... Eiffel, конечно, нечто. Но, человек, так сказать "подсидевший" smile Вирта заслуживает внимания...

Автор: Lazin 31.3.2009, 11:35
Цитата(kemiisto @  31.3.2009,  10:55 Найти цитируемый пост)
Хм... Это постулат такой? Тогда, если не трудно, автор, книга, страница.

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

Цитата(baldina @  31.3.2009,  11:13 Найти цитируемый пост)
а замечание носило общий характер: есть принцип в инженерии - чем меньше связей, тем надежнее система, тем проще её  сопровождать и модернизировать. в применении к классам C++ это означает, что следует стремиться их делать по возможности независимыми друг от друга.
 smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)