Тут размещают свои топики новички в С/С++.

Тема в разделе "LANGS.C", создана пользователем nitrotoluol, 4 мар 2007.

  1. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    censored
    спасибо, медитирую :)
     
  2. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    Arthur
    Код (Text):
    1. #include <iostream>
    2.  
    3. class Q
    4. {
    5. public:
    6.         virtual ~Q()
    7.         {
    8.         }
    9.     void Void()
    10.     {
    11.         myVoid();
    12.     }
    13. protected:
    14.     virtual bool myVoid(){printf("Q::myVoid"); return false;}
    15. };
    16.  
    17. class Z : public Q
    18. {
    19. protected:
    20.     bool myVoid(){printf("Z::myVoid"); return true;}
    21. };
    22.  
    23. int main()
    24. {
    25.   Q *pObject = new Z;
    26.   pObject->Void(); //"Z::myVoid"
    27.   delete pObject;
    28.  
    29.   return 0;
    30. }
     
  3. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    varnie
    спасибо, за более наглядный пример :)

    А вот как же быть со стековыми объектами?

    Код (Text):
    1. int main()
    2. {
    3.   Z zObj;
    4.   zObj.Void();
    5.   return 0;
    6. }
     
  4. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    Arthur
    а что с ними не так? по-прежнему будет обращение к bool Z::myVoid();
    протестил свой пример постом выше с твоей реализацией ф-ции main().
    по-прежнему выводится "Z::myVoid". или я недопонимаю, чтО тебе нужно?
     
  5. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    varnie
    Понять немогу :dntknw: вроде мой класс(не эти Q и Z) работает нормально до тех пор, пока в новом классе не объявляю конструктор. Как только я это делаю, то виртуальная функция в новом классе перестает работать :dntknw:
     
  6. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    Код (Text):
    1. class Q
    2. {
    3. public:
    4.     Q(){myVoid();}
    5.     ~Q(){}
    6.  
    7. protected:
    8.     virtual bool myVoid(){printf("Q"); return false;}
    9. };
    10.  
    11. class Z : public Q
    12. {
    13. public:
    14.     Z() : Q(){//Q();}
    15.     ~Z(){}
    16. protected:
    17.     bool myVoid(){printf("Z"); return true;}
    18. };
    19.  
    20. int main()
    21. {
    22.   Z pObject;
    23.   pObject.~Z();
    24.  
    25.   return 0;
    26. }
    Вот такая вот, ахинея :dntknw: Меня уже глючит :dntknw:
     
  7. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    Arthur
    вкратце: вызывать виртуальные методы в конструкторах/деструкторах нельзя.
    вот подробнее:
    http://www.artima.com/cppsource/nevercall.html
    http://gcc.gnu.org/ml/gcc-help/2001-11/msg00214.html
     
  8. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    Все, понял. Как говорится - "Дурная голова, мозгам покоя не дает" :)
     
  9. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    Arthur
    я бы на твоем месте пересмотрел дизайн кода, и избавилса бы от необходимости вызова виртуального метода из конструктора класса.
    и еще, в любом случае явный вызов деструктора автоматического объекта вообще ненужен, т.к. память, выделенная под него, освободится автоматически после выхода этого объекта из его области видимости:
    Код (Text):
    1. int main()
    2. {
    3.   Z pObject;
    4.   pObject.~Z(); //<-- убрать
    5.  
    6.   return 0;
    7. } //pObject освобождается здесь сам
     
  10. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    И сделай деструктор виртуальным.
     
  11. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    Смысл?

    varnie
    Да, придется перестраивать код.
     
  12. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    Arthur
    В противном случае деструкторы производных классов вызваны не будут.

    Пример:

    Код (Text):
    1. class A
    2. {
    3. public:
    4.     virtual void f() = 0;
    5.     ~A()
    6.     {
    7.         std::cout << "A::~A()" << std::endl;
    8.     };
    9. };
    10.  
    11. class B : public A
    12. {
    13. public:
    14.     virtual void f() {};
    15.     ~B()
    16.     {
    17.         std::cout << "B::~B()" << std::endl;
    18.     };
    19. };
    20.  
    21. int main()
    22. {
    23.     A* ptr = new B();
    24.     delete ptr;
    25.  
    26.     return 0;
    27. }
    В консоли появится:

    Т.е. объект класса B уничтожен не полностью. Если сделать деструктор базового класса виртуальным:

    Код (Text):
    1. virtual ~A()
    В консоли видим:

    Объект уничтожен правильно.
     
  13. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    W4FhLF
    Усе понял.

    Всем спасибо! Вопрос решен.

    P. S: А еще говорят ассемблер сложный :)
     
  14. Keva

    Keva New Member

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    130
    Доброго времени суток. Заинтересовала проблема программирования под ICQ протокол и почтовый, пните пожалуйста в нужном направлении, буду признателен.
     
  15. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Keva
    sf.net
     
  16. Awerto

    Awerto New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2007
    Сообщения:
    61
    Keva
    http://iserverd.khstu.ru/docum_ext/icqkurs.htm
     
  17. Keva

    Keva New Member

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    130
    censored Awerto
    спасибо!
     
  18. Green_DiCk

    Green_DiCk New Member

    Публикаций:
    0
    Регистрация:
    8 июл 2007
    Сообщения:
    338
    Нужно в главном файле программы (main.сpp) использовать ф-цию из другого файла xxx.c
    Почему не работает такой вариант:
    main.cpp
    Код (Text):
    1. //...
    2. extern int foo(...); // прототип ф-ции, реализованной в файле xxx.c
    3. //...
    4. int main()
    5. {//...
    6.  foo(...);
    7. //...}
    Линкёр выдает свою корронную фразу: "unresolved externak symbol int __cdecl foo(...) ..."
     
  19. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    Green_DiCk
    Код (Text):
    1. //xxx.h
    2. #include "stdio.h"
    3. int foo(int x){printf("x=%d", x);}
    4.  
    5. //test.cpp
    6. #include "xxx.h"
    7. extern int foo(int x);
    8.  
    9. int main(){
    10.   foo(1);
    11.   return 0;
    12. }
     
  20. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    #include "xxx.c"

    Но лучше вынести объявление в "xxx.h" и подключить его.