Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
0 / 0 / 1
Регистрация: 03.12.2016
Сообщений: 83

Создать массив указателей на объекты класса, описывающего насекомых

11.09.2018, 18:15. Показов 4697. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Создать массив указателей на объекты класса, описывающего насекомых (количество ног, наличие крыльев, цвет, название.). Создать новый массив указателей на объекты с летающими насекомыми.

Если разбирать само задание, я должен создать класс насекомое, где объектами будут как раз ноги, крылья, цвет и название.
Потом я должен создать массив указателей на объекты класса, к сожалению пока не понимаю как.

Создаю класс насекомое с конструктором и пытаюсь как-то вывести это

Header.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#define insect_hpp
#include <iostream>
using namespace std;
 
enum colortype { зеленый = 1, коричневый, мультицвет };
enum nametype { жук = 1, клоп, муравей, гусеница, бабочка };
class insect
{
public:
    insect();
    
    void Print();
 
    unsigned insect::Setinsect(nametype name, int paw, int wing, colortype color);
private:
    
    int paw; //количество лап
    int wing; // количество крыльев
    colortype color; //цвет 
    nametype name;
};
Source.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include "stdafx.h"
#include "Header.h"
using namespace std;
 
insect::insect()  //дефолтный конструктор
{
    this->name = nametype(05);
    this->paw = 6;
    this->wing = 4;
    this->color = colortype(03);
    
}
unsigned insect::Setinsect(nametype name, int paw, int wing, colortype color) //тут планировал добавить проверки
{
    int flag = 0;
    this->name = name;
    this->paw = paw;
    this->wing = wing;
    this->color = color;
    return flag;
 
}
 
void insect::Print() //вывод на экран
{
    std::cout <<"Название - "<< name;
    std::cout <<"  крыльев - "<< wing;
    std::cout <<"  лап - "<< paw;
    std::cout << "  цвет - \n"<<color;
}
и main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include "stdafx.h"
#include <iostream>
#include "Header.h"
using namespace std;
int main()
{
    
    setlocale(LC_ALL, "Russian");
    insect one_insect;
    
    int w,p;
    nametype n;
    colortype c;
    
    int d;
    cout << "# название";
    cin >> d;
    if (d == 1) {
        n = nametype(1);
    }
    if (d == 2) {
        n = nametype(2);
    }
    if (d == 3) {
        n = nametype(3);
    }
    if (d == 4) {
        n = nametype(4);
    }
    if (d == 5) {
        n = nametype(5);
    }
    cout << "крылья ";
    cin >> w;
    cout << "лапы ";
    cin >> p;
    int d2;
    cout << "цвет ";
    cin >> d2;
    if (d2 == 1) {
        c = colortype(1);
    }
    if (d2 == 2) {
        c = colortype(2);
    }
    if (d2 == 3) {
        c = colortype(3);
    }
    one_insect.Setinsect(n, w, p, c);
    one_insect.Print();
        return 0;
}
По идее мне надо создать массив насекомых, т.е пользователь вводит параметры и они сохраняются в новое насекомое, как можно это реализовать?
А потом уже массив указателей на объекты класса. Это вообще пока не понимаю как и зачем

Помогите пожалуйста, как написать этот массив указателей на объекты, хоть немного. Заранее благодарен
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.09.2018, 18:15
Ответы с готовыми решениями:

Динамический массив указателей на объекты класса
Добрый вечер! Нужна помощь У меня имеется класс STROKA(вроде уже готовый,и все хорошо) Только вот никак не могу понять, как создать...

Можно ли динамически выделить память под массив указателей, на объекты класса?
Прошу прощения если не правильно назвал вопрос. Не знаю как правильно сформулировать. Можно ли строчку VisualizationTools* VT; заменить...

Как создать массив указателей на объекты
Задача состоит в создании многофайлового проекта. Каждый класс находится в отдельном файле. В файле main.cpp нужно создать массив...

23
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
11.09.2018, 18:29
Цитата Сообщение от SexyHpexy Посмотреть сообщение
Создать массив указателей на объекты класса
сколько насекомых в массиве должно быть? вот массив из 5 указателей.
C++
1
insect* a[5];
Добавлено через 1 минуту
Цитата Сообщение от SexyHpexy Посмотреть сообщение
enum colortype { зеленый = 1, коричневый, мультицвет };
enum nametype { жук = 1, клоп, муравей, гусеница, бабочка };
почему кириллица тут? это не есть хорошо.

Добавлено через 8 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
insect* a[5]
{
    new insect();
    new insect();
    new insect();
    new insect();
    new insect();
};
// что то делаем и обязательно освобождаем память.
delete a[0];
delete a[1];
delete a[2];
delete a[3];
delete a[4];
0
0 / 0 / 1
Регистрация: 03.12.2016
Сообщений: 83
11.09.2018, 18:29  [ТС]
Кириллицу исправлю, сейчас бы с указателями пока разобраться(
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
11.09.2018, 18:32
Цитата Сообщение от SexyHpexy Посмотреть сообщение
Это же получается массив указателей только на класс, на 5 насекомых, а на объекты класса это что? Я должен как-то обращаться к внутренним объектам класса же или нет?
это массив указателей на объекты класса insect, указателей на класс не бывает, нет такого понятия
0
0 / 0 / 1
Регистрация: 03.12.2016
Сообщений: 83
11.09.2018, 18:32  [ТС]
Это тема на указатели, не должно быть new delete(
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
11.09.2018, 18:33
Цитата Сообщение от SexyHpexy Посмотреть сообщение
Это тема на указатели, не должно быть new delete(
а что должно быть? откуда указатели брать если не из new
0
0 / 0 / 1
Регистрация: 03.12.2016
Сообщений: 83
11.09.2018, 19:16  [ТС]
Цитата Сообщение от _stanislav Посмотреть сообщение
а что должно быть? откуда указатели брать если не из new
Вот в примере "указатель на объекты" есть только это
C++
1
2
3
4
5
6
7
8
9
10
11
12
class P_EXAMPLE {
// . . .
};
main(void)
{
P_EXAMPLE obj, // объект
*ptrobj; // указатель на объект
obj.setNum(1); // прямой доступ
ptrobj = &obj; // присвоение адреса
ptrobj -> setNum(2); // доступ через указатель
return 0;
}
Я действительно пытаюсь понять, но никак просто.
Создаю класс, далее должен ввести данные, например 5 раз и получить массив классов.
Или сразу уже массив указателей, не понимаю.....

Добавлено через 34 минуты
Я еще думал, что вторая часть задания Создать новый массив указателей на объекты с летающими насекомыми. связана с первой частью, т.е я как-то должен обратиться к конкретному полю класса (крылья) через указатель и проверить, если не 0, тогда записываю в новый массив
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
11.09.2018, 19:20
SexyHpexy, вот тебе простой пример.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
#include <string>
 
class Test
{
private:
    std::string value;
 
public:
    void Set(const std::string& s)
    {
        value = s;
    }
    std::string Get() const
    {
        return value;
    }
};
 
int main()
{
    Test* a[3];
 
    // Присваиваем массиву указатели на Test.
    a[0] = &Test();
    a[1] = &Test();
    a[2] = &Test();
 
    // Присваиваем value значение.
    a[0]->Set("1");
    a[1]->Set("2");
    a[2]->Set("3");
 
    // Получаем из value значение.
    std::cout << a[0]->Get() << std::endl;
    std::cout << a[1]->Get() << std::endl;
    std::cout << a[2]->Get() << std::endl;
 
    return 0;
}
0
0 / 0 / 1
Регистрация: 03.12.2016
Сообщений: 83
11.09.2018, 21:52  [ТС]
Вот я все еще пытаюсь понять.
Создали класс test, далее создали массив указателей размерностью 3. Теперь заполняем массив объектами из класса test?
C++
1
2
3
    a[0] = &Test();
    a[1] = &Test();
    a[2] = &Test();
Потом берем значения, которые нужно поместить в массив и далее печатаем их

Добавлено через 6 минут
Касательно моей задачи, я оставляю пока тот класс и теперь сразу создаю массив указателей на объекты класса и что-то опять не так

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

Если нам запрещено использовать new, то можно просто создать нужные объекты, а потом загнать в массив указатели на них:
C++
1
2
3
4
5
6
7
8
Insect bug("Bug", 6, 4, "brown"); // жук
Insect fly("Fly", 6, 2, "green"); // муха
Insect flea("Flea", 6, 0, "hz");  // блоха
 
Insect *v[3]; // массив указателей
v[0] = &bug;
v[1] = &fly;
v[2] = &flea;
Здесь я использовал инициализирующий конструктор вместо функции Setinsect, а название и цвет задавал в виде строки (так мне кажется логичнее), но это не является принципиальным.
1
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
12.09.2018, 09:44
Цитата Сообщение от likehood Посмотреть сообщение
Такой способ создания объектов, через указатель на временный экземпляр класса, не выглядит удачным.
Как вы аккуратно выразились, однако.
Чего уж тут острожничать - способ не только неудачный, но и откровенно ошибочный как по сути, так и согласно правилам языка (и порядочный компилятор выдаст ошибку компиляции для него).

Добавлено через 12 минут
SexyHpexy, А вы уверены, что количество ног необходимо выносить в параметр конструктора? У насекомых не бывает другого числа ног, кроме как шесть. Нет, ну можно, конечно, подумать, что часть ног конкретная особь могла потерять и их стало меньше, но в вашем случае ничто не мешает задать 8 или 12 - а это уже ошибка дизайна. Вообще свойство "количество ног" задается доменом "Насекомые" и не нуждается в отдельном указании - это если по-хорошему.
Отдельный вопрос, стоит ли обособлять личиночные стадии как отдельное название. Может все-таки добавить классу свойство является ли особь личинкой или взрослой? Ведь гусеница, например, капустницы (название вида) не перестает быть капустницей из-за этого. А делать отдельные объекты "гусеница капустницы" и "капустница (бабочка)" тоже странно (см. принцип «бритвы Оккама»).

Добавлено через 7 минут
Да, и здесь необходимо определиться. Объекты - это у нас таксономическая единица, описывающая вид (тогда и признак личнинка\взрослый не нужен, так же как и возможность задавать меньшее кол-во ног, чем шесть), либо объект у нас описывает конкретную особь (тогда признак "взрослости" нужен, и количество ног тоже не будет смотреться дико).
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
12.09.2018, 10:17
Цитата Сообщение от DrOffset Посмотреть сообщение
но и откровенно ошибочный согласно правилам язык
с этим конечно я согласен, но
Цитата Сообщение от DrOffset Посмотреть сообщение
способ не только неудачный, но и откровенно ошибочный как по сути
раз пример работает значит он удачный и по сути своей работает без ошибок.
0
0 / 0 / 1
Регистрация: 03.12.2016
Сообщений: 83
12.09.2018, 10:34  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
А вы уверены, что количество ног необходимо выносить в параметр конструктора? У насекомых не бывает другого числа ног, кроме как шесть. Нет, ну можно, конечно, подумать, что часть ног конкретная особь могла потерять и их стало меньше, но в вашем случае ничто не мешает задать 8 или 12 - а это уже ошибка дизайна. Вообще свойство "количество ног" задается доменом "Насекомые" и не нуждается в отдельном указании - это если по-хорошему.
Полностью задание звучит так, поэтому ноги я и вынес в конструктор
Создать массив указателей на объекты класса, описывающего насекомых
(количество ног, наличие крыльев, цвет и т.д.). Создать новый массив указателей на объекты с летающими насекомыми. Не брать во внимание следующий факт: количество ног у насекомых всегда 6; личинка, нимфа (или куколка) – стадии развития (метаморфоз); пауки и многоножки к насекомым не относятся.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
12.09.2018, 10:49
Цитата Сообщение от _stanislav Посмотреть сообщение
раз пример работает значит он удачный и по сути своей работает без ошибок.
Он не работает.
В вашей конкретной ситуации просто повезло, что он выдал ожидаемое. Стоит чуть изменить ситуацию, и все сразу ломается. Код, который так себя ведет, не может называться рабочим.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
#include <string>
 
class Test
{
private:
    std::string value;
 
public:
    void Set(std::string const & s)
    {
        value = s;
    }
    std::string Get() const
    {
        return value;
    }
};
 
void init(Test * (&a)[3])
{
    // Присваиваем массиву указатели на Test.
    a[0] = &Test();
    a[1] = &Test();
    a[2] = &Test();
}
 
int main()
{
    Test* a[3];
 
    init(a);
    
    // Присваиваем value значение.
    a[0]->Set("1");
    a[1]->Set("2");
    a[2]->Set("3");
   
    // Получаем из value значение.
    std::cout << a[0]->Get() << std::endl;
    std::cout << a[1]->Get() << std::endl;
    std::cout << a[2]->Get() << std::endl;
 
    return 0;
}
http://rextester.com/TTEN6619

Мне совершенно странно, что приходится вам это объяснять, вы все-таки не первый день здесь.

Добавлено через 3 минуты
SexyHpexy, Про задание понятно.
Ответ и вариант кода, которого вероятнее всего отвас ждут, дан в посте №10.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
12.09.2018, 10:53
Цитата Сообщение от DrOffset Посмотреть сообщение
В вашей конкретной ситуации просто повезло
вот я и говорю что код удачный и он работает в этой конкретной ситуации

Не по теме:

но суть не в этом а суть в том что любое мнение даже самое авторитетное можно оспорить

0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
12.09.2018, 11:06
Цитата Сообщение от _stanislav Посмотреть сообщение
но суть не в этом а суть в том что любое мнение даже самое авторитетное можно оспорить
Это только вы думаете, что вы что-то оспорили.
Есть такой рассказ Василия Шукшина, называется "Срезал". Рекомендую почитать, он короткий. Как раз на эту тему.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
12.09.2018, 11:11

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
Это только вы думаете, что вы что-то оспорили.
так же как и вы я полагаю

0
12.09.2018, 11:20

Не по теме:

Цитата Сообщение от _stanislav Посмотреть сообщение
так же как и вы я полагаю
Вам что, нравится позориться?
Или вы действительно свято убеждены, что научив ТС некорректному коду, вы ему чем-то поможете? :)

0
12.09.2018, 11:23

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
Вам что, нравится позориться?
Или вы действительно свято убеждены, что научив ТС некорректному коду, вы ему чем-то поможете? :)
Цитата Сообщение от _stanislav Посмотреть сообщение
Сообщение от DrOffset
но и откровенно ошибочный согласно правилам язык
с этим конечно я согласен, но
нужно уметь слушать не только себя

0
12.09.2018, 11:24

Не по теме:

Цитата Сообщение от _stanislav Посмотреть сообщение
нужно уметь слушать не только себя
Аналогичный вопрос к вам.
Повторю предыдущий вопрос. Если вы понимаете и осознаете, что код некорректный, зачем вы его предлагаете как решение? :)

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.09.2018, 11:24
Помогаю со студенческими работами здесь

Виртуальные функции (создать массив указателей на объекты трех классов)
Задание: создать массив указателей на объекты трех классов. Метод Show почему-то не переопределяется. В данном коде вводится 3 элемента в...

Создать массив указателей базового класса и присвоить ему адреса каждого из екземпляров класса
Всем привет. Есть условие задачи: Дан базовый класс Base у которого есть метод my_name, метод выводит сообщение This is Base class. От...

QSet указателей на объекты класса, сортированный по полю класса
Здравствуйте. Возьмём тестовый класс: class TEST { public: TEST(); QString name; } Допустим у меня есть...

Вектор указателей на объекты класса
Добрый вечер! Есть базовый класс Place от него наследуется класс City. Мне нужно реализовать функцию добавления объекта в вектор и...

Хранение в контейнере указателей на объекты класса
Здравствуйте, очень прошу помочь разобраться: У меня есть учебная задача: Я хочу решить ее без использования баз данных, так...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru