Важная информация
Показано с 1 по 6 из 6

Тема: Массив указателей на объекты класса C++

  1. #1 Массив указателей на объекты класса C++ 
    Новичок
    Регистрация
    11.09.2018
    Сообщений
    1
    Сказал(а) спасибо
    1
    Поблагодарили 0 раз(а) в 0 сообщениях
    Хелп. Помогите пожалуйста. Не могу понять задание
    Создать массив указателей на объекты класса, описывающего насекомых
    (количество ног, наличие крыльев, цвет и т.д.). Создать новый массив указателей на объекты с летающими насекомыми.


    Была идея,
    1. создать класс насекомое, описать объекты - ноги, крылья, цвет и т.д
    2. сделать массив таких классов (вроде бы получилось)
    А дальше с этими указателями ничего не понимаю. Указатель на класс нужно делать или как сделать к объектами, да еще и массив ????????
    А если делать указатель на класс, то как потом вытащить оттуда наличие крыльев, это же объект???
    Помогите пожалуйста

    Попытки были, 2ой день сижу((
    Header.h
    C++ Code:
    1. #define insect_hpp
    2. #include <iostream>
    3. using namespace std;
    4. enum colortype { зеленый = 1, коричневый, мультицвет };
    5. enum nametype { жук = 1, клоп, муравей, гусеница, бабочка };
    6. class insect
    7. {
    8. public:
    9. insect();
    10. void Print();
    11.  
    12. unsigned insect::Setinsect(nametype name, int paw, int wing, colortype color);
    13. private:
    14. int paw; //количество лап
    15. int wing; // количество крыльев
    16. colortype color; //цвет
    17. nametype name;
    18. };
    19.  
    20.  
    21. /*бабочка - multicolor, 6 лап, 4 крыла
    22. гусеница - multicolor, 6 лап, 0 крыльев
    23. жук - зеленый, 6 лап, 4 крыла
    24. клоп - коричневый, 6 лап, 0 крыльев
    25. муравей - коричневый, 6 лап, 0 крыльев
    26.  
    27. */

    Source.cpp

    C++ Code:
    1. #include "stdafx.h"
    2. #include "Header.h"
    3. using namespace std;
    4.  
    5. insect::insect()
    6. {
    7. this->name = nametype(05);
    8. this->paw = 6;
    9. this->wing = 4;
    10. this->color = colortype(03);
    11.  
    12. }
    13. unsigned insect::Setinsect(nametype name, int paw, int wing, colortype color)
    14. {
    15. int flag = 0;
    16. this->name = name;
    17. this->paw = paw;
    18. this->wing = wing;
    19. this->color = color;
    20. return flag;
    21.  
    22. }
    23.  
    24. void insect::Print()
    25. {
    26. std::cout << "Название - " << name;
    27. std::cout << "  крыльев - " << wing;
    28. std::cout << "  лап - " << paw;
    29. std::cout << "  цвет - " << color;
    30. std::cout << "  \n  ";
    31. }


    main.cpp

    C++ Code:
    1. #include "stdafx.h"
    2. #include <iostream>
    3. #include "Header.h"
    4. using namespace std;
    5. int main()
    6. {
    7.  
    8. setlocale(LC_ALL, "Russian");
    9.  
    10. int no = 3;
    11. int i;
    12. int w, p;
    13. nametype n;
    14. colortype c;
    15.  
    16. int d;
    17. insect a[3];
    18. for (i = 0; i < no; i++)
    19. {
    20.  
    21. cout << "# название";
    22. cin >> d;
    23. if (d == 1) {
    24. n = nametype(1);
    25. }
    26. if (d == 2) {
    27. n = nametype(2);
    28. }
    29. if (d == 3) {
    30. n = nametype(3);
    31. }
    32. if (d == 4) {
    33. n = nametype(4);
    34. }
    35. if (d == 5) {
    36. n = nametype(5);
    37. }
    38. cout << "крылья ";
    39. cin >> w;
    40. cout << "лапы ";
    41. cin >> p;
    42. int d2;
    43. cout << "цвет ";
    44. cin >> d2;
    45. if (d2 == 1) {
    46. c = colortype(1);
    47. }
    48. if (d2 == 2) {
    49. c = colortype(2);
    50. }
    51. if (d2 == 3) {
    52. c = colortype(3);
    53. }
    54. a[i].Setinsect(n, w, p, c);
    55. }
    56. for (i = 0; i < no; i++)
    57. {
    58. a[i].Print();
    59. }
    60. return 0;
    61. }
    Ответить с цитированием  
     

  2. #2  
    Профи
    Регистрация
    09.11.2013
    Сообщений
    143
    Сказал(а) спасибо
    17
    Поблагодарили 59 раз(а) в 37 сообщениях
    класс это прототип объектов, создать указатель на объект класса можно вызвав его конструктор
    Ответить с цитированием  
     

  3. #3  
    Новичок
    Регистрация
    16.07.2018
    Сообщений
    13
    Сказал(а) спасибо
    1
    Поблагодарили 13 раз(а) в 9 сообщениях
    C++ Code:
    1. Class Aninal {}; // класс, внутрь допиши конструктор и пр.
    2.  
    3. Animal animal; // обьект класса, в данном случае вызывается конструктор без параметров
    4.  
    5. Animal *panimal; // указатель на обьект
    6. panimal = &animal; // теперь все изменения обьекта по указателю - это операции над обьектом animal
    7.  
    8. // с другой стороны...
    9.  
    10. panimal = new Animal[10];
    11. // тут создан массив из 10 обьектов
    12. cout << panimal[3].age();
    13. // тут мы обращаемся к методу третьего обьекта в массиве
    14.  
    15. Массив обьектов это не лучшая идея. Во первых чтобы это работало нужно обязательно описывать конструктор по умолчанию(без параметров). Во вторых это должен быть массив конкретных (не абстрактных) классов. В третьих это часто неэффективно, ну если класс имеет много полей и не поддерживает семантику перемещения - то сортировка, например, может работать сильно дольше. Но можно же создать массив указателей...
    16.  
    17. Animal** animals;
    18. // теперь надо выделить память под элементы массива:
    19. animals = new Animal*[10];
    20. // тут тип элемента - указатель на Animal
    21. //  а значит использовать его можно как я описывал выше. Т.е. либо выделить там память под массив обьектов (в итоге получится двумерный массив). Либо как массив указателей ( что от тебя и требуют).
    22.  
    23. Ну и обрабатывай дальше жтот массив...
    24.  
    25. for (int i = 0; i < 10; ++i) {
    26.   animals[i] = new Animal(12, 3, 55); // какой то конструктор
    27.   cout << animals[i]->age();
    28.   cout << (*animals[i]).name();
    29. }
    Ответить с цитированием  
     

  4. 3 пользователя(ей) сказали cпасибо:

    >Quiet Snow< (12.09.2018), Free Admin (14.09.2018), KariLex (12.09.2018)

  5. #4  
    Новичок
    Регистрация
    20.09.2018
    Сообщений
    1
    Сказал(а) спасибо
    0
    Поблагодарили 0 раз(а) в 0 сообщениях
    Цитата Сообщение от ur_naz Посмотреть сообщение
    класс это прототип объектов, создать указатель на объект класса можно вызвав его конструктор
    А можно подробнее расписать этот момент?
    Ответить с цитированием  
     

  6. #5  
    Профи
    Регистрация
    09.11.2013
    Сообщений
    143
    Сказал(а) спасибо
    17
    Поблагодарили 59 раз(а) в 37 сообщениях
    Класс только описывает свойства, присущие объекту.
    Объект класса создается отдельно с помощью конструктора.
    Если в конструкторе выделяется память под данные, эту память нужно освободить в деструкторе.
    Чтобы создать объект класса нужно вызвать конструктор
    Чтобы уничтожить объект класса нужно вызвать деструктор
    При создании указателя на объект вызывается конструктор
    При удалении указателя на объект вызывается деструктор

    C++ Code:
    1.  
    2.  
    3. #include <iostream>
    4.  
    5. using namespace std;
    6.  
    7. enum Color{ Green, Brown, Multyple };
    8.  
    9. enum Name { Beetle = 1, Spider = 2 , Ant = 3 };
    10.  
    11. class Insect {
    12.  
    13. public:
    14. //  конструктор
    15. Insect(Name _n ){
    16. switch(_n)
    17. {
    18.      case Beetle:
    19.              paws  = 6;
    20.              wings = 4;
    21.              color = Multyple;
    22.              name = _n;
    23.              cout << "beetle created" << endl;
    24.              break;
    25.      case Spider:
    26.              paws  = 8;
    27.              wings = 0;
    28.              color = Brown;
    29.              name = _n;cout << "spider created" << endl;
    30.     break;
    31.      case 3:
    32.              paws  = 6;
    33.              wings = 0;
    34.              color = Multyple;cout << "ant created" << endl;
    35.              name = _n;
    36.     break;
    37. }
    38. }
    39. // деструктор
    40. ~Insect() {
    41.         switch(this->name)
    42. {
    43.      case Beetle:
    44.              cout << "beetle destroyed" << endl;
    45.              break;
    46.      case Spider:
    47.     cout << "spider destroyed" << endl;
    48.     break;
    49.      case 3:
    50.              cout << "ant destroyed" << endl;
    51.     break;
    52. }
    53. }
    54.  
    55.  
    56.     int   paws;  //количество лап
    57.     int   wings; // количество крыльев
    58.     Color color; //цвет
    59.     Name  name;  //наименование
    60. };
    61.  
    62. typedef  Insect* PInsect;
    63.  
    64. int main(){
    65.  
    66.     // создаем массив указателей на объекты типа Insect
    67.     PInsect insects [3];
    68.     
    69.     // создаем новый объект и указатель на него и ложим указатель в массив
    70.     insects[0] = new Insect(Beetle);
    71.     insects[1] = new Insect(Spider);
    72.     insects[2] = new Insect(Ant);
    73.  
    74.     int paws  = 0;
    75.     int wings = 0;
    76.     
    77.     // считаем лапы и крылья: берем из массива указатель на объект и вытаскиваем
    78.     // из объекта данные, применяя -> вместо .
    79.     for (int i = 0; i<3; i++) {
    80.      paws  += insects[i]->paws;
    81.      wings += insects[i]->wings;
    82.  
    83.      }
    84.     
    85.     // печатаем результат
    86.     cout << paws << " & " << wings << endl;  
    87.     
    88.  
    89.     for (int i = 0; i<3; i++) {
    90.     
    91.      delete insects[i];
    92.  
    93.     }
    94.     
    95.     cin.get();
    96.  
    97.     return 0;
    98.     
    99. }


    сам объект является ссылкой на данные, которые он хранит

    класс ==> объект (ссылка) <==> указатель
    ________ /\
    ________ ||
    ________ ||
    ________ \/
    ________ данные
    Ответить с цитированием  
     

  7. 2 пользователя(ей) сказали cпасибо:

    >Quiet Snow< (21.09.2018), Free Admin (24.09.2018)

  8. #6  
    Новичок
    Регистрация
    16.07.2018
    Сообщений
    13
    Сказал(а) спасибо
    1
    Поблагодарили 13 раз(а) в 9 сообщениях
    Норм. Конструктор стоит как то отрефакторить чтобы локализовать эти магические числа. Вообще класс animal тут смахивает на кривую фабрику. Кривизна в том, что эта фабрика и является животным.
    C++ Code:
    1.  
    2. struct Animal {
    3.   Animal(int paws, int wings, int color, Type type)
    4.     : paws(paws), m_wings(wings),
    5.       m_color (color), m_type(type) {};
    6.   int m_paws, m_wings, m_color;
    7.   Type m_type;
    8. };
    9. namespace AnimalFactory {
    10.   Animal* get(Type type) {
    11.     switch (type) {
    12.     case Beetle:
    13.       return new Animal(0, 4, Multiple, type);
    14.     case Spider:
    15.       return new Animal(8, 0, Brown, type);
    16.     case Ant:
    17.       return new Animal(6, 0, Multiple, type);
    18.   }
    19. }
    20.  
    21. // ...
    22. Animal* myAnimal = AnimalFactory::get(type);


    Я тут кое что улучшил, но не понятно почему бы не создать разные классы животных... вот это поле Type выглядит так, будто мы на си без плюсов птшем...
    Ответить с цитированием  
     

  9. 2 пользователя(ей) сказали cпасибо:

    >Quiet Snow< (22.09.2018), Free Admin (24.09.2018)

Информация о теме
Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Циклы, объекты, потоки
    от Good.Morning в разделе FreeBasic
    Ответов: 15
    Последнее сообщение: 26.12.2015, 20:55
  2. Ответов: 2
    Последнее сообщение: 11.01.2015, 18:52
  3. Задача на объекты, С++, visual studio
    от Аделина в разделе Архив
    Ответов: 3
    Последнее сообщение: 25.04.2014, 11:20
  4. Ответов: 2
    Последнее сообщение: 21.01.2011, 21:23
  5. Ответов: 11
    Последнее сообщение: 25.12.2010, 02:33
Ваши права
  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •