Джесс Либерти - Освой самостоятельно С++ за 21 день.

Тут можно читать онлайн Джесс Либерти - Освой самостоятельно С++ за 21 день. - бесплатно полную версию книги (целиком) без сокращений. Жанр: comp-programming. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    Освой самостоятельно С++ за 21 день.
  • Автор:
  • Жанр:
  • Издательство:
    неизвестно
  • Год:
    неизвестен
  • ISBN:
    нет данных
  • Рейтинг:
    4.11/5. Голосов: 91
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 80
    • 1
    • 2
    • 3
    • 4
    • 5

Джесс Либерти - Освой самостоятельно С++ за 21 день. краткое содержание

Освой самостоятельно С++ за 21 день. - описание и краткое содержание, автор Джесс Либерти, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

В книге широко представлены возможности новейшей версии программного продукта Microsoft Visual C++. Подробно описаны средства и подходы программирования современных профессиональных приложений. Материалы книги дополнены многочисленными демонстрационными программами, в процессе разработки которых максимально используются возможности программных инструментов Microsoft Visual Studio. Особое внимание уделено новинкам версии 6.0 и новейшим технологиям объектно-ориентированного программирования, включая использование библиотеки MFC и шаблонов классов, а также создание связанных списков. Отдельное занятие посвящено вопросам объектно-ориентированного анализа и проектирования приложений. Подробно рассмотрены все средства и подходы конструирования собственных пользовательских классов.

Книга рассчитана на широкий круг читателей, интересующихся современными проблемами программирования.

Освой самостоятельно С++ за 21 день. - читать онлайн бесплатно полную версию (весь текст целиком)

Освой самостоятельно С++ за 21 день. - читать книгу онлайн бесплатно, автор Джесс Либерти
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

8: void GetVals(int&, int&);

9: typedef void (*VPF) (int&, int&);

10: void PrintVals(VPF,int&, int&);

11:

12: int main()

13: {

14: int val0ne=1, valTwo=2;

15: int choice;

16: bool fQuit = false;

17:

18: VPF pFunc;

19:

20: while (fQuit == false)

21: {

22: cout << "(0)Quit (1)Change Values (2)Square (3)Cube (4)Swap: ";

23: cin >> choice;

24: switch (choice)

25: {

26: case 1:pFunc = GetVals; break;

27: case 2:pFunc = Square; break;

28: case 3:pFunc = Cube; break;

29: case 4:pFunc = Swap; break;

30: default:fQuit = true; break;

31: }

32: if (fQuit == true)

33: break;

34: PrintVals ( pFunc, valOne, valTwo);

35: }

36: return 0;

37: }

38:

39: void PrintVals( VPF pFunc,int& x, int& y)

40: {

41: cout << "x: " << x << " y: " << y << endl;

42: pFunc(x,y);

43: cout << "x: " << x << " y: " << y << endl;

44: }

45:

46: void Square (int & rX, int & rY)

47: {

48: rX *= rX;

49: rY *= rY;

50: }

51:

52: void Cube (int & rX, int & rY)

53: {

54: int tmp;

55:

56: tmp = rX;

57: rX *= rX;

58: rX = rX * tmp;

59:

60: tmp = rY;

61: rY *= rY;

62: rY = rY * tmp;

63: }

64:

65: void Swap(int & rX, int & rY)

66: {

67: int temp;

68: temp = rX;

69: rX = rY;

70: rY = temp;

71: }

72:

73: void GetVals (int & rValOne, int & rValTwo)

74: {

75: cout << "New value for ValOne: ";

76: cin >> rValOne;

77: cout << "New value for ValTwo: ";

78: cin >> rValTwo;

79: }

Результат:

(0)Quit (1 )Change Values (2)Square (3)Cube (4)Swap: 1

x: 1 y: 2

New value for ValOne: 2

New value for ValTwo: 3

x: 2 y: 3

(0)Quit (1 )Change Values (2)Square (3)Cube (4)Swap: 3

x: 2 y: 3

x: 8 y: 27

(0)Quit (1)Change Values (2)Square (3)Cube (4)Swap: 2

x: 8 y: 27

x: 64 y: 729

(0)Quit (1)Change Values (2)Square (3)Cube (4)Swap: 4

x: 64 y: 729

x: 729 y: 64

(0)Quit (1)Change Values (2)Square (3)Cube (4)Swap: 0

Анализ:В строке 9 с помощью оператора typedef объявляется новый тип VPF как указатели на функции, возвращающие void и принимающие две ссылки на int. В строке 10 объявляется функция PrintVals(), которая принимает три параметра: VPF и две ссылки на integer. В строке 18 указатель Pfunc объявляется как принадлежащий TnnyVPF.

После объявления типа VPF дальнейшее использование указателя pFunc и функции PrintVals() становится проще и понятнее. Информация, выводимая программой на экран, не изменилась.

Указатели на функции члены

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

Для создания такого указателя используется тот же синтаксис, что и для указателя на обычную функцию, но с добавлением имени класса и оператора области видимости (::). Таким образом, объявление указателя pFunc на функции-члены класса Shape, принимающие два целочисленных параметра и возвращающие void, выглядит следующим образом:

void (Shape::*pFunc) (int,int);

Указатели на функции-члены используются так же, как и рассмотренные ранее указатели простых функции. Единственное отличие состоит в том, что для вызова функции необходимо наличие объекта соответствующего класса, для которого вызываются функции. В листинге 14.10 показано использование указателя на метод класса.

Листинг 14.10. Указатели на функции-члены

1: //Листинг 14.10. Указатели на виртуальные функции-члены

2:

3: #include

4:

5: class Mammal

6: {

7: public:

8: Mammal():itsAge(1) { }

9: virtual ~Mammal() { }

10: virtual void Speak() const = 0;

11: virtual void Move() const = 0;

12: protected:

13: int itsAge;

14: };

15:

16: class Dog : public Mammal

17: {

18: public:

19: void Speak()const { cout << "Woof!\n"; }

20: void Move() const { cout << "Walking to heel...\n"; }

21: };

22:

23:

24: class Cat : public Mammal

25: {

26: public:

27: void Speak()const { cout << "Meow!\n"; }

28: void Move() const { cout << "slinking...\n"; }

29: };

30:

31:

32: class Horse : public Mammal

33: {

34: public:

35: void Speak()const { cout << "Whinny!\n"; }

36: void Move() const 1 cout << "Galloping...\n"; }

37: };

38:

39:

40: int main()

41: {

42: void (Mammal::*pFunc)() const =0;

43: Mammal* ptr =0;

44: int Animal;

45: int Method;

46: bool fQuit = false;

47:

48: while (fQuit == false)

49: {

50: cout << "(0)Quit (1)dog (2)cat (3)horse

51: cin >> Animal;

52: switch (Animal)

53: {

54: case 1: ptr = new Dog; break;

55: case 2: ptr = new Cat; break;

56: case 3: ptr = new Horse; break;

57: default: fQuit = true; break;

58: }

59: if (fQuit)

60: break;

61:

62: cout << "(1)Speak (2)Move: ";

63: cin >> Method;

64: switch (Method)

65: {

66: case 1: pFunc = Mammal::Speak; break;

67: default: pFunc = Mammal::Move; break;

68: }

69:

70: (ptr->*pFunc)();

71: delete ptr;

72: }

73: return 0;

74: }

Результат:

(0)Quit (1)dog (2)cat (3)horse: 1

(1)Speak (2)Move: 1

Woof!

(0)Quit (1)dog (2)cat (3)horse: 2

(1)Speak (2)Move: 1

Meow!

(0)Quit (1)dog (2)cat (3)horse: 3

(1)Speak (2)Move: 2

Galloping

(0)Quit (1)dog (2)cat (3)horse: 0

Анализ:В строках 4—14 объявляется тип абстрактных данных Mammal с двумя чистыми виртуальными методами Speak() и Move(). От класса Mammal производятся подклассы Dog, Cat и Horse, в каждом из которых замещаются соответствующим образом функции Speak() и Move().

В процессе выполнения тела функции main() пользователю предлагается выбрать животное, после чего в области динамического обмена создается новый подкласс выбранного животного, адрес которого присваивается в строках 54—56 указателю ptr.

Затем пользователь выбирает метод, который связывается с указателем pFunc. В строке 70 выбранный метод вызывается для созданного объекта посредством предоставления доступа к объекту с помощью указателя ptr и к функции с помощью указателя pFunc.

Наконец, строкой 71 для указателя ptr вызывается функция delete, которая очищает область памяти, занятую созданным ранее объектом. Заметьте, что нет смысла вызывать delete для pFunc, поскольку последний является указателем на код, а не на объект в области памяти. Хотя даже при попытке сделать это вы получите сообщение об ошибке компиляции.

Массивы указателейна функции-члены

Аналогично указателям на обычные функции, указатели на функции-члены могут храниться в массиве. Для инициализации такого массива можно использовать адреса различных функций-членов. В таком случае, чтобы вызвать для объекта тот или иной метод, достаточно просто указать массив и индекс смещения. Именно такой подход применяется в листинге 14.11.

Листинг 14.11. Массив указателей на функции-члены

1: // Листинг 14.11. Массивы указателей на функции-члены

2:

3: #include

4:

5: class Dog

6: {

7: public:

8: void Speak()const { cout << "Woof!\n"; }

9: void Move() const { cout << "Walking to heel...\n"; }

10: void Eat() const { cout << "Gobbling food...\n"; }

11: void Growl() const { cout << "Grrrrr\n"; }

12: void Whimper() const { cout << "Whining noises...\n"; }

13: void RollOver() const { cout << "Rolling over...\n"; }

14: void PlayDead() const { cout << "Is this the end of Little Caesar?\n";

15: };

16:

17: typedef void (Dog::*PDF)()const;

18: int main()

19: {

20: const int MaxFuncs = 7;

21: PDF DogFunctions[MaxFuncs] =

22: { Dog::Speak,

23: Dog::Move,

24: Dog::Eat,

25: Dog::Growl,

26: Dog::Whimper,

27: Dog::RollOver,

28: Dog::PlayDead };

29:

30: Dog* pDog =0;

31: int Method;

32: bool fQuit = false;

33:

34: while (!fQuit)

35: {

36: cout << "(0)Quit (1)Speak (2)Move (3)Eat (4)Growl";

37: cout << " (5)Whimper (6)Roll Over (7)Play Dead: ";

38: cin >> Method;

39: if (Method == 0)

40: {

41: fQuit = true;

42: }

43: else

44: {

45: pDog = new Dog;

46: (pDog->*DogFunctions[Method-1])();

47: delete pDog;

48: }

49: }

50: return 0;

51: }

Результат:

(0)Quit (1)Speak (2)Move (3)Eat (4)Growl (5)Whimper (6)Roll 0ver (7)Play

Dead: 1

Woof!

(0)Quit (1)Speak (2)Move (3)Eat (4)Growl (5)Whimper (6)Roll 0ver (7)Play

Dead: 4

Grrr

(0)Quit (1)Speak (2)Move (3)Eat (4)Growl (5)Whimper (6)Roll 0ver (7)Play

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Джесс Либерти читать все книги автора по порядку

Джесс Либерти - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




Освой самостоятельно С++ за 21 день. отзывы


Отзывы читателей о книге Освой самостоятельно С++ за 21 день., автор: Джесс Либерти. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x