Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
 Аватар для Ded_Vasilij
233 / 215 / 63
Регистрация: 01.09.2012
Сообщений: 2,103

Использование объекта одного класса при создании нового класса

20.03.2013, 19:00. Показов 1927. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер. У меня такая проблема. Есть готовый класс L2 - список, на его основе нужно создать дек. Я поступил так:
в приватной части дека объявил переменную типа L2, и на ее основе реализовал все остальные функции, конструкторы там, деструктор и прочее. Возникла проблема с оператором =. Чего то не могу сообразить как это сделать, подскажите пожалуйста. Код приведен ниже

файл deque.h

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#pragma once
#include <iostream>
#include "L2.h"
class deq 
{
    L2 L;
public:
    deq();
    ~deq();
    deq(const deq& d);
    deq& operator = (const deq& d);
    bool isEmpty ()const;                       // проверка на пустоту
    char popHead ();                            // получить элемент из начала списка
    char popTail ();                            // получить элемент из конца списка
    void pushHead (char c);                     // добавить элемент в начало списка
    void pushTail (char c);                     // добавить элемент в конец списка           
    void printHead ()const;                     // печать с головы
    void printTail()const;                      // печать с хвоста
    int size ()const;                           // размер списка
    void makeEmpty();                           // сделать пустым
    static void deq_menu(); 
};
deque.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
53
54
55
56
#include "deque.h"
using namespace std;
    deq :: deq()
    {
        
    }
    deq :: ~deq()
    {
        L.~L2();
    }
    deq :: deq(const deq& d): L(d.L)
    {
        
    }
    deq& deq ::  operator = (const deq& d)// вот здесь основная проблема
    {
        //L.operator= ( d);
    }
    bool deq :: isEmpty ()const                     // проверка на пустоту
    {
        return L.isEmpty();
    }
    char deq :: popHead ()                          // получить элемент из начала списка
    {
        return L.popHead();
    }
    char deq ::  popTail ()                         // получить элемент из конца списка
    {
        return L.popTail();
    }
    void deq :: pushHead (char c)                       // добавить элемент в начало списка
    {
        L.pushHead(c);
    }
    void deq :: pushTail (char c)                       // добавить элемент в конец списка           
    {
        L.pushTail(c);
    }
    void deq :: printHead ()const                       // печать с головы
    {
        L.printHead();
    }
    void deq :: printTail()const                        // печать с хвоста
    {
        L.printTail();
    }
    int deq :: size ()const                         // размер списка
    {
        return L.size();
    }
    void deq :: makeEmpty()                         // сделать пустым
    {
        L.makeEmpty();
    }
    void deq :: deq_menu()
    {}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.03.2013, 19:00
Ответы с готовыми решениями:

Ошибка при создании объекта класса
Приветствую, форумчане! Возник вопрос при создании объекта класса String. Что самое интересное, когда пишу ту же прогу без параметров в...

Ошибка при создании объекта класса
Здравствуйте. В коде ниже при попытке вывести код на экран возникает следующая ошибка: prog.cpp: In function 'int main()': ...

Ошибка при создании объекта класса
Привет! Чтобы на протяжении всего поста было понятно о чём я говорю,в конце поста прикреплю код. Так вот, при создании объекта класса...

7
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
20.03.2013, 19:19
Нафига нужен такой класс, если твой дек предоставляет интерфейс такой же, как у нижележащего списка?
Не стоит явно вызывать деструктор, он и так вызовется, а у тебя он вызывается дважды.
C++
1
2
3
4
deq& deq ::  operator = (const deq& d)// вот здесь основная проблема
    {
        L = d.L;
    }
0
 Аватар для egor2116
584 / 387 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
20.03.2013, 19:22
Есть готовый класс L2 - список, на его основе нужно создать дек.
Разве здесь не легче использовать наследование ? и переопределить и добавить необходимые методы?
C++
1
2
3
4
5
6
7
class L2{
...
};
 
class Deq : public L2{
...
};
1
545 / 344 / 12
Регистрация: 05.11.2010
Сообщений: 1,076
Записей в блоге: 1
20.03.2013, 19:27
Когда ты реализуешь одну фукциональность на основе другой, идеалогически правильно использовать композицию, а не наследование.
В данном случае вообще не понятно, зачем нужен этот класс, так как интерфейс у него абсолютно такой же, как у L2.
2
 Аватар для egor2116
584 / 387 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
20.03.2013, 19:29
одну фукциональность на основе другой
Поясните тогда смысл наследования.
0
 Аватар для Ded_Vasilij
233 / 215 / 63
Регистрация: 01.09.2012
Сообщений: 2,103
20.03.2013, 19:46  [ТС]
Цитата Сообщение от Герц Посмотреть сообщение
Нафига нужен такой класс, если твой дек предоставляет интерфейс такой же, как у нижележащего списка?
Не стоит явно вызывать деструктор, он и так вызовется, а у тебя он вызывается дважды.
В деке нет вставки и удаления на указанную позицию. А какие есть еще варианты? Мне, если честно такая реализация тоже не очень нравится, а до более грамотного решения не додумался. Подскажите пожалуйста
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
20.03.2013, 23:23
Цитата Сообщение от egor2116 Посмотреть сообщение
Поясните тогда смысл наследования.
Наследование — это когда одна функциональность = другая в полном объёме + что-то ещё или что-то по-другому.

Раз у списка нет вставки, то придумайте, как реализовать дек так, чтобы она была.
2
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
20.03.2013, 23:38
нормальная реализация из того, что было. главное список наружу не торчит и в случае чего можно будет сделать дек на основе чего-то другого. то, что интерфейсы у списка и дека получились одинаковые - это совпадение. если сделать например на основе std::list то этого уже не будет. но клиенты исходного дека останутся без изменений, т.к. интерфейс дека остался без изменений.
по поводу оператора =:
если L2 написан по нормальному, то у него уже должен быть такой оператор. а раз так, то методы:
~deq();
deq(const deq& d);
deq& operator = (const deq& d);
вообще писать не надо. то, что сгенерит компилятор по умолчанию вполне будет работоспособным.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.03.2013, 23:38
Помогаю со студенческими работами здесь

Объявление объекта одного класса в описании другого класса
Здравствуйте. Почему при объявлении Student s в классе Teacher не возникает ошибки? Ведь такой объект уже существует. И почему при...

Использование перегруженного оператора ввода/вывода в поток базового класса для объекта производного класса
Здравствуйте! Можно ли использовать перегруженный оператор ввода/вывода в поток из базового класса для объекта производного класса, если...

ООП в C++: Вызов родительского конструктора с параметром при создании объекта дочернего класса
Здравствуйте! Столкнулся с такой проблемой: если есть родительский класс с конструктором, то при создании дочернего объекта от этого...

rand() при создании разных объектов одного класса в них одинаков
создаю динамическую матрицу в объекте, заполняемую рандомно, в каждом объекте одно и то же заполнение, как грамматно исправить? ...

Использование метода из одного класса в другом
Здравствуйте! Проходим классы, все никак не могу понять, как использовать метод из одного класса в другом.. Доходит до меня только на...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера 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. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru