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

Тема в разделе "WASM.BOOKS и WASM.BLOGS", создана пользователем EvilsInterrupt, 3 сен 2005.

  1. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    В книге Дж. Либерти: "Освой самостоятельно С++ за 21 день", 4 изд.

    Есть код, стр.367, листинг 12.10:
    Код (Text):
    1. #include <iostream>
    2.  
    3. using namespace std;
    4.  
    5. class Mammal
    6. {
    7. public:
    8.     Mammal():itsAge(1){}
    9.     virtual ~Mammal(){}
    10.     virtual void Speak() const {cout << "Mammal speak\n";}
    11.  
    12. protected:
    13.     int itsAge;
    14. };
    15.  
    16. class Dog : public Mammal
    17. {
    18. public:
    19.     void Speak() const {cout << "Woof\n";}
    20. };
    21.  
    22. class Cat : public Mammal
    23. {
    24. public:
    25.     void Speak() const {cout << "Meow\n";}
    26. };
    27.  
    28. void ValueFunction(Mammal);
    29. void PtrFunction(Mammal *);
    30. void RefFunction(Mammal &);
    31.  
    32. int main()
    33. {
    34.     Mammal * ptr = 0;
    35.     int choice;
    36.     while(1)
    37.     {
    38.         bool fQuit = false;
    39.         cout << "(1)Dog (2)Cat (0)Quit: ";
    40.         cin >> choice;
    41.         switch(choice)
    42.         {
    43.         case 0:
    44.             fQuit = true;
    45.             break;
    46.         case 1:
    47.             ptr = new Dog;
    48.             break;
    49.         case 2:
    50.             ptr = new Cat;
    51.             break;
    52.         default:
    53.             ptr = new Mammal;
    54.             break;
    55.         }
    56.         if(fQuit)
    57.             break;
    58.         PtrFunction(ptr);
    59.         RefFunction(*ptr);
    60.         ValueFunction(*ptr);
    61.     }
    62.     return 0;
    63. }
    64.  
    65. void ValueFunction(Mammal MammalValue)
    66. {
    67.     MammalValue.Speak;
    68. }
    69.  
    70. void PtrFunction(Mammal * pMammal)
    71. {
    72.     pMammal->Speak();
    73. }
    74.  
    75. void RefFunction(Mammal & rMammal)
    76. {
    77.     rMammal.Speak();
    78. }


    Данный код, хоть и иллюстрирует не которые важные для изучения языка

    концепции, но в то же время является глючным!

    Почему:

    1. Предполжим вы выбрали "1", вам выдался результат

    2. Во второй раз, т.к. цикл вечный вы выбираете допстим 3, но ведь

    прошлый объект из памяти не удален! следовательно может возникнуть

    утечка памяти.



    ЗЫ:

    Все это для тех кто, как и я изучает этот язык!
     
  2. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    IMHO, не стоит изучать С++ по книжкам типа "за 21 день".

    Лучше с самого начала подойти к делу систематически, тем более с опытом программирования на асме.
     
  3. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    ТЫ эту книгу держал в руках? Нет, тогда с начала подержи ее, а лучше почитай, это лучшее что мне удалось найти! У меня 5 электронных и две в бумаге, эта и Г.Шидт в бумаге. Этот автор не выделывается, а действительно показывает Язык!
     
  4. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    EvilsInterrupt

    ну, может быть...

    Просто я когда-то смотрел книгу с похожим названием, автора не помню.
     
  5. noonv

    noonv Member

    Публикаций:
    0
    Регистрация:
    19 июл 2005
    Сообщения:
    209
    Адрес:
    Russia
    EvilsInterrupt

    книга действительно неплохая.