Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
IvanKhalifa
0 / 0 / 0
Регистрация: 11.04.2017
Сообщений: 3
1

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

11.04.2017, 13:43. Просмотров 214. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.04.2017, 13:43
Ответы с готовыми решениями:

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

Первые шаги.
Здравствуйте. Извините, может, за тупые вопросы. Но с языком С впервые...

Первые шаги в программированнии!
Добрые товарищи помогите чайнику в программировании с одной проблемой. Я решил...

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

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

9
GbaLog-
Любитель чаепитий
3166 / 1472 / 465
Регистрация: 24.08.2014
Сообщений: 5,204
Записей в блоге: 1
Завершенные тесты: 2
11.04.2017, 13:47 2
Цитата Сообщение от IvanKhalifa Посмотреть сообщение
при запуске выдает segmentation fault.
у меня ничего не выдаёт.
покажи код с наследованием.
0
IvanKhalifa
0 / 0 / 0
Регистрация: 11.04.2017
Сообщений: 3
11.04.2017, 15:34  [ТС] 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
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-
Любитель чаепитий
3166 / 1472 / 465
Регистрация: 24.08.2014
Сообщений: 5,204
Записей в блоге: 1
Завершенные тесты: 2
11.04.2017, 15:57 4
ну, не удивительно.
когда ты пытаешься создать экземпляр класса item - автоматически вызывается конструктор по-умолчанию класса menu(т.к. он базоый), а в этом конструкторе вызываются создание экземпляра item, который в свою очередь снова дергает конструктор класса menu, и т.д.
получается рекурсия, которая забивает стек.
0
hoggy
Нарушитель
Эксперт С++
7086 / 3129 / 648
Регистрация: 15.11.2014
Сообщений: 7,201
Завершенные тесты: 1
11.04.2017, 20:26 5
Цитата Сообщение от IvanKhalifa Посмотреть сообщение
menu(само меню) и производный от него item(строки меню)
то есть у вас отдельная строка меню является самим меню?
у вас все в порядке с логикой?

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

у вас menu создает items, а item - menu.
бесконечная рекурсия,
перереполнение стека,
и живительная эвтаназия от операцинки.
0
Photofenix
61 / 61 / 39
Регистрация: 18.11.2016
Сообщений: 513
Завершенные тесты: 1
11.04.2017, 21:09 6
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
шКодер самоучка
1968 / 1745 / 860
Регистрация: 09.10.2013
Сообщений: 3,854
Записей в блоге: 6
Завершенные тесты: 2
11.04.2017, 21:21 7
Цитата Сообщение от Photofenix Посмотреть сообщение
lesson_1* ptr[5];
Цитата Сообщение от Photofenix Посмотреть сообщение
delete [] ptr;
что то тут не так...
0
Photofenix
61 / 61 / 39
Регистрация: 18.11.2016
Сообщений: 513
Завершенные тесты: 1
11.04.2017, 21:29 8
Что не так?
0
IvanKhalifa
0 / 0 / 0
Регистрация: 11.04.2017
Сообщений: 3
12.04.2017, 10:39  [ТС] 9
Цитата Сообщение от hoggy Посмотреть сообщение
то есть у вас отдельная строка меню является самим меню?
у вас все в порядке с логикой?
код не читал.
очевидно жеж, говнокод начинается вот здесь:
class item: public menu
так я же сразу написал: Если класс item не наследовать от menu - все работатет.
Отдельная строка меню, по моему замыслу, будет наследовать от меню некоторые методы, например draw(), некоторые переменные, например name.
Для меня пока не очевидно, что при создании объекта item создается объект menu еще раз, конструкторы-то разные. Гворя по другому: при рождении у матери ребенка не появляется же еще одна мать
Цитата Сообщение от Photofenix Посмотреть сообщение
Что не так?
Кстати да, встречал на просторах инета утверждение что delete[] удаляет указатель на сам массив указателей, но никак не содержимое. И поэтому некоторые удаляют объекты обходя весь массив. Хотя в книге Лафоре написано:
Квадратные скобки, следующие за операцией delete, означают, что мы освобождаем массив. При освобождении памяти, выделенной для одиночного объекта, использования скобок не требуется...при освобождении памяти, занимаемой массивом, скобки обязательны. Их использование подразумевает, что мы освобождаем память, используемую для всех членов массива, одновременно.
Спасибо всем, кто помогает! Пойду еще покурю книги...
0
GbaLog-
Любитель чаепитий
3166 / 1472 / 465
Регистрация: 24.08.2014
Сообщений: 5,204
Записей в блоге: 1
Завершенные тесты: 2
12.04.2017, 10:42 10
Цитата Сообщение от IvanKhalifa Посмотреть сообщение
по моему замыслу, будет наследовать от меню некоторые методы, например draw(), некоторые переменные, например name.
можно сделать интерфейс ака IDrawable. от которого наследовать все вещи, которые могут рисоваться.
Цитата Сообщение от IvanKhalifa Посмотреть сообщение
Для меня пока не очевидно, что при создании объекта item создается объект menu еще раз, конструкторы-то разные. Гворя по другому: при рождении у матери ребенка не появляется же еще одна мать
по вашей логике рождается.
Цитата Сообщение от IvanKhalifa Посмотреть сообщение
Пойду еще покурю книги...
хорошая идея.
0
12.04.2017, 10:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.04.2017, 10:42

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

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

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


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru