Вход/Регистрация
QT 4: программирование GUI на С++
вернуться

Саммерфилд Марк

Шрифт:

Указанные выше функции реализовывались бы как встроенные функции, являющиеся частью определения класса. Альтернативный подход заключается в предоставлении в заголовочном файле только прототипов функций и реализации функций в файле .cpp. В этом случае заголовочный файл имел бы следующий вид:

01 #ifndef POINT2D_H

02 #define POINT2D_H

03 class Point2D

04 {

05 public:

06 Point2D;

07 Point2D(double x, double у);

08 void setX(double x);

09 void setY(double у);

10 double x const;

11 double y const;

12 private:

13 double xVal;

14 double yVal;

15 };

16 #endif

Реализация функций выполнялась бы в файле point2d.cpp:

01 #include "point2d.h"

02 Point2D::Point2D

03 {

04 xVal = 0.0;

05 yVal = 0.0;

06 }

07 Point2D::Point2D(double x, double у)

08 {

09 xVal = x;

10 yVal = у;

11 }

12 void Point2D::setX(double x)

13 {

14 xVal = x;

15 }

16 void Point2D::setY(double у)

17 {

18 yVal = у;

19 }

20 double Point2D::x const

21 {

22 return xVal;

23 }

24 double Point2D::y const

25 {

26 return yVal;

27 }

Этот файл начинается с включения заголовочного файла point2d.h, потому что прежде чем компилятор будет выполнять синтаксический анализ реализаций функций—членов, он должен иметь определение класса. Затем идут реализации функций, перед именем которых через оператор :: указывается имя класса.

Мы узнали, как можно реализовать встроенную функцию и как можно реализовать ее в файле .cpp. Семантически эти два подхода эквивалентны, однако при вызове встроенной функции большинство компиляторов просто разворачивают тело функции вместо формирования реального вызова функции. Обычно это ведет к получению более быстрого кода, но может увеличить размер приложения. По этой причине только очень короткие функции следует делать встроенными; длинные функции всегда следует реализовывать в файле .cpp. Кроме того, если мы забудем реализовать какую-нибудь функцию и попытаемся ее вызвать, компоновщик «пожалуется» на существование неразрешенного символа.

Теперь попытаемся использовать этот класс.

01 #include "point2d.h"

02 int main

03 {

04 Point2D alpha;

05 Point2D beta(0.666, 0.875);

06 alpha.setX(beta.y);

07 beta.setY(alpha.x);

08 return 0;

09 }

В С++ переменные любого типа можно объявлять без непосредственного использования оператора new. Первая переменная инициализируется с помощью стандартного конструктора Point2D (т.е. конструктора без параметров). Вторая переменная инициализируется с использованием второго конструктора. Обращение к члену объекта осуществляется с использованием оператора . (точка).

Объявленные таким образом переменные ведут себя как элементарные типы Java и C# (такие, как int и double). Например, при использовании оператора присваивания копируется содержимое переменной, а не ссылка на объект. И если позже переменная будет модифицирована, значение всех других переменных, к которым присваивалась первая переменная, не изменится.

С++, как объектно—ориентированный язык, поддерживает наследование и полиморфизм. Для иллюстрации этих свойств мы рассмотрим пример абстрактного класса Shape (фигура) и подкласса Circle (окружность). Начнем с базового класса:

01 #ifndef SHAPE_H

02 #define SHAPE_H

03 #include "point2d.h"

04 class Shape

05 {

06 public:

07 Shape(Point2D center) { myCenter = center; }

08 virtual void draw = 0;

09 protected:

10 Point2D myCenter;

11 };

12 #endif

Определение класса создается в заголовочном файле с именем shape.h. Поскольку в этом определении делается ссылка на класс Point2D, мы включаем заголовочный файл point2d.h.

  • Читать дальше
  • 1
  • ...
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: