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

ООП, первые шаги

11.04.2017, 13:43. Показов 784. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Собственно, начал изучать С++. Решил наваять небольшую програмку, которая выводит что-то типа текстового меню.
Создал классы: menu(само меню) и производный от него item(строки меню). Моя задумка: при создании объекта menu в его конструкторе создаются объекты item, тем самым наполняя меню. Программа компилируется но при запуске выдает segmentation fault.
Если класс item не наследовать от menu - все работатет.
Прошу помощи.
И сразу еще вопросы:
1. Я так понимаю, у родительского объекта просто так, без телодвижений нельзя взять список порожденных от него дочерних объектов?
2. Деструкторы. Я понимаю, что при (new объект) выделяется область в памяти для хранения объекта. Но так ли потом необходим delete объект касательно моей программы? Объектов item мало, они не пересоздаются в процессе работы.
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <stdlib.h>
#include <cstring>
using namespace std;
 
const int NUM_ITEMS = 5;
const int ITEM_LEN = 16;
 
class item;
class menu {
private:
    item *itemPtr[NUM_ITEMS]; //массив указателей на объекты класса item
public:
    menu();
    ~menu();
};
 
class item {
public:
    item() {
    }
    ;
    ~item() {
    }
    ;
};
 
menu::menu() {
    itemPtr[0] = new item();  //наполняем меню пунктами
}
menu::~menu() {
    delete itemPtr[0];  //прибираем за собой item
}
 
int main() {
    menu mymenu;
    return 0;
}

Заранее благодарен за ответы!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.04.2017, 13:43
Ответы с готовыми решениями:

C++ первые шаги (абсолютно первые)
Привет, пользователи CyberForum. Я относительно давний юзер этого форума, и вот, наконец-то решил воплощать мечту в реальность, а именно...

Первые шаги.
Здравствуйте. Извините, может, за тупые вопросы. Но с языком С впервые сталкиваюсь. Использую среду прогр-я C-Free Standard 4.0. Открыл...

Первые шаги в программированнии!
Добрые товарищи помогите чайнику в программировании с одной проблемой. Я решил изучить язык програмирования Си++, скачал полную коллекцию...

9
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
11.04.2017, 13:47
Цитата Сообщение от IvanKhalifa Посмотреть сообщение
при запуске выдает segmentation fault.
у меня ничего не выдаёт.
покажи код с наследованием.
0
0 / 0 / 0
Регистрация: 11.04.2017
Сообщений: 3
11.04.2017, 15:34  [ТС]
Кликните здесь для просмотра всего текста
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
60
61
62
63
#include <iostream>
#include <stdlib.h>
#include <cstring>
using namespace std;
 
const int NUM_ITEMS = 5;
const int ITEM_LEN = 16;
 
class item;
 
class menu {
private:
    item *itemsArr[NUM_ITEMS];
protected:
    char name[ITEM_LEN];
public:
    void draw();
    void setName(const char *sname);
    menu();
    ~menu();
};
 
class item: public menu {
private:
    char text[20];
public:
    item();
    ~item() {
    }
    ;
};
 
menu::menu() {
    for (int i = 0; i < NUM_ITEMS; i++) {
        itemsArr[i] = new item();
        itemsArr[i]->setName("item");
    }
}
menu::~menu() {
    for (int i = 0; i < NUM_ITEMS; i++)
        delete itemsArr[i];
}
void menu::setName(const char *sname) {
    int i = 0;
    for (i; i < ITEM_LEN - 1; i++)
        name[i] = sname[i];
    name[i] = '\0';
}
void menu::draw() {
    cout << name << "\n";
    for (int i = 0; i < NUM_ITEMS; i++)
        itemsArr[i]->draw();
}
 
item::item() {
}
 
int main() {
    menu mymenu;
    mymenu.setName("menu1:");
    mymenu.draw();
    return 0;
}

при запуске вываливается exit value -1, а по моей задумке должно выводить:
menu1:
item
item
item
item
item
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
11.04.2017, 15:57
ну, не удивительно.
когда ты пытаешься создать экземпляр класса item - автоматически вызывается конструктор по-умолчанию класса menu(т.к. он базоый), а в этом конструкторе вызываются создание экземпляра item, который в свою очередь снова дергает конструктор класса menu, и т.д.
получается рекурсия, которая забивает стек.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
11.04.2017, 20:26
Цитата Сообщение от IvanKhalifa Посмотреть сообщение
menu(само меню) и производный от него item(строки меню)
то есть у вас отдельная строка меню является самим меню?
у вас все в порядке с логикой?

код не читал.
очевидно жеж, говнокод начинается вот здесь:
class item: public menu

у вас menu создает items, а item - menu.
бесконечная рекурсия,
перереполнение стека,
и живительная эвтаназия от операцинки.
0
63 / 63 / 39
Регистрация: 18.11.2016
Сообщений: 562
11.04.2017, 21:09
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
#include <Windows.h>
#include <iostream>
#include <string>
 
class lesson_1{
public:
    lesson_1(){
        std::cout << "lesson_1" << std::endl;
    }
    ~lesson_1(){
        std::cout << "DELETE lesson_1" << std::endl;
    }
};
 
 
class lesson_2{
private:
    lesson_1* ptr[5];
public:
    lesson_2(){
        short i (0);
        while (i < 5)
            ptr[i++] = new lesson_1;
    }
 
    ~lesson_2(){
        std::cout << "DELETE ptrs" << std::endl;
        delete [] ptr;
    }
 
};
 
 
int main(){
    SetConsoleCP (1251);
    SetConsoleOutputCP (1251);
 
    lesson_2* ptr = new lesson_2;
    delete ptr;
 
    system ("pause");
    return NULL;
};
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
11.04.2017, 21:21
Цитата Сообщение от Photofenix Посмотреть сообщение
lesson_1* ptr[5];
Цитата Сообщение от Photofenix Посмотреть сообщение
delete [] ptr;
что то тут не так...
0
63 / 63 / 39
Регистрация: 18.11.2016
Сообщений: 562
11.04.2017, 21:29
Что не так?
0
0 / 0 / 0
Регистрация: 11.04.2017
Сообщений: 3
12.04.2017, 10:39  [ТС]
Цитата Сообщение от hoggy Посмотреть сообщение
то есть у вас отдельная строка меню является самим меню?
у вас все в порядке с логикой?
код не читал.
очевидно жеж, говнокод начинается вот здесь:
class item: public menu
так я же сразу написал: Если класс item не наследовать от menu - все работатет.
Отдельная строка меню, по моему замыслу, будет наследовать от меню некоторые методы, например draw(), некоторые переменные, например name.
Для меня пока не очевидно, что при создании объекта item создается объект menu еще раз, конструкторы-то разные. Гворя по другому: при рождении у матери ребенка не появляется же еще одна мать
Цитата Сообщение от Photofenix Посмотреть сообщение
Что не так?
Кстати да, встречал на просторах инета утверждение что delete[] удаляет указатель на сам массив указателей, но никак не содержимое. И поэтому некоторые удаляют объекты обходя весь массив. Хотя в книге Лафоре написано:
Квадратные скобки, следующие за операцией delete, означают, что мы освобождаем массив. При освобождении памяти, выделенной для одиночного объекта, использования скобок не требуется...при освобождении памяти, занимаемой массивом, скобки обязательны. Их использование подразумевает, что мы освобождаем память, используемую для всех членов массива, одновременно.
Спасибо всем, кто помогает! Пойду еще покурю книги...
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
12.04.2017, 10:42
Цитата Сообщение от IvanKhalifa Посмотреть сообщение
по моему замыслу, будет наследовать от меню некоторые методы, например draw(), некоторые переменные, например name.
можно сделать интерфейс ака IDrawable. от которого наследовать все вещи, которые могут рисоваться.
Цитата Сообщение от IvanKhalifa Посмотреть сообщение
Для меня пока не очевидно, что при создании объекта item создается объект menu еще раз, конструкторы-то разные. Гворя по другому: при рождении у матери ребенка не появляется же еще одна мать
по вашей логике рождается.
Цитата Сообщение от IvanKhalifa Посмотреть сообщение
Пойду еще покурю книги...
хорошая идея.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.04.2017, 10:42
Помогаю со студенческими работами здесь

Первые шаги в освоении С++
Добрый день! Решил начать изучение С++. Для этого, как полагается, скачал соответствующую литературу и софт. После нескольких попыток...

Первые шаги: ничего не получается
Всем привет! Я скачала советуемую здесь на форуме версию wxDev-C++ 7.3.1. Но у меня ничего не получается. Даже на банальном примере из...

Первые шаги: есть ли ошибки в программе?
#include &quot;iostream.h&quot; #include &quot;conio.h&quot; #include &quot;math.h&quot; int main() { float a,b,f; a=1000; b=0.01; ...

Поделитесь опытом. С чего вы начинаете новый проект? Первые шаги?
Народ, поделитесь пож опытом.... Вот выучил я с++ до того уровня что могу сам написать что-то... Теперь надо понять чтоя могу...

Вызов точки останова во время выхода (первые шаги в классах C++)
Парни! Такая проблема: вылетает в конце, когда завершаю работу программы. Суть программы: есть класс продукт, в нём три переменные и три...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru