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

Абстрактный класс для копирования объекта и указатель для него

28.11.2015, 01:06. Просмотров 1065. Ответов 0
Метки нет (Все метки)


Есть задача:
Реализовать класс-контейнер Стек, состоящий из объектов одного и того же типа. Методы класса должны принимать указатель на абстрактный класс Obj (содержащий чисто виртуальную функцию Obj* clone() для создания копии объекта при добавлении в контейнер). Класс Obj должен быть базовым для классов различных типов объектов, которые может содержать стек (int, double, string). Все эти классы должны переопределять чисто виртуальную функцию класса Obj.
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#include <iostream>
#include <string>
 
using namespace std;
 
class Obj { public: virtual Obj* clone() = 0; };
 
class IntObj : public Obj {
    int element;
public:
    IntObj(){};
    IntObj (int temp) { element = temp; }
    Obj* clone() { return new IntObj(element); }
};
 
class DoubleObj : public Obj {
    double element;
public:
    DoubleObj(){};
    DoubleObj (double temp) { element = temp; }
    Obj* clone() { return new DoubleObj(element); }
};
 
class StringObj : public Obj {
    string element;
public:
    StringObj(){};
    StringObj (string temp) { element = temp; }
    Obj* clone() { return new StringObj(element); }
};
 
class Stack {
    Obj **ptr;
    int size = 1;
public:
    Stack() { ptr = new Obj*[size]; }
    
    Stack(const Stack &s) {
        size = s.getSize();
        for(int i = 0; i < size; i++)
            *ptr[i] = s.getPtr()[i];
    }
    
    ~Stack() { delete [] ptr; }
    
    Obj *getPtr() const { return *ptr; }
    int getSize() const { return size; }
    
    void push(Obj *obj) {
        Obj** ptrTemp = new Obj*[size];
        
        ptr[size - 1] = obj->clone();
        
        for (int i = 0; i < size; i++)
            ptrTemp[i] = ptr[i];
        
        delete [] ptr;
        
        size++;
        
        ptr = new Obj*[size];
        
        for (int i = 0; i < size - 1; i++)
            ptr[i] = ptrTemp[i];
        
        delete [] ptrTemp;
    }
    
    void del () {
        Obj** ptrTemp = new Obj*[size];
        
        for (int i = 0; i < size - 1; i++)
            ptrTemp[i] = ptr[i];
        
        delete [] ptr;
        
        size--;
        
        ptr = new Obj*[size];
        
        for (int i = 0; i < size - 1; i++)
            ptr[i] = ptrTemp[i];
        
        delete [] ptrTemp;
    }
    
    Obj* pop() {
        if (size > 1) {
            Obj *temp;
            temp = ptr[size - 2];
            del();
            return temp;
        } else  {
            cout << "Стек был пуст.\n";
            delete [] ptr;
            exit(EXIT_FAILURE);
        }
    }
    
    void show() {
        if (size > 1) {
            cout << "Печать стека: ";
            
            for (int i = size - 1; i >= 0; i--)
                cout << ptr[i] << " ";
            
            cout << "\n";
        } else
            cout << "Стек пуст.\n";
    }
};
 
int main() {
    Stack i;
    Obj *ai = new IntObj(5);
    IntObj *bi = dynamic_cast<IntObj*>(ai);
    i.push(bi);
    i.show();
    
    Stack d;
    Obj *ad = new DoubleObj(5.0);
    DoubleObj *bd = dynamic_cast<DoubleObj*>(ad);
    d.push(bd);
    d.show();
    
    Stack s;
    Obj *as = new StringObj("aaa");
    StringObj *bs = dynamic_cast<StringObj*>(as);
    s.push(bs);
    s.show();
    
    return 0;
}
т.к. базовый класс - абстрактный, то для создания объекта используем указатель и void show() { cout << ptr[i] } выводит адрес элемента, а не его значение. При попытке вывести на экран *ptr[i] естественно возникает ошибка: Invalid operands to binary expression ('ostream'(aka 'basic_ostream<char>') and 'Obj') как можно привести типы?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.11.2015, 01:06
Ответы с готовыми решениями:

Конструктор копирования для класса с указателем на абстрактный класс
Всем привет. Как реализовать конструктор копирования для класса Foo? class Base { public: ...

Создание объекта через указатель на базовый абстрактный класс
Есть абстрактный класс, от него наследуется 3 класса. В программе предусмотрено создание нового...

Как создать указатель на абстрактный класс для дальнейшего помещения в список?
Как создать указатель на абстрактный класс в Windows Form для дальнейшего помещения в список итд? ...

Класс: Разработать абстрактный класс класс Point для задания координаты...
Всем привет, помогите пожалуйста решить задачу, я уже всю голову сломал, не знаю как решить... ...

__________________
Помогаю в написании студенческих работ здесь.
Записывайтесь на профессиональные курсы C++ разработчиков
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.11.2015, 01:06

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

При возврате объекта из функции пишет, что для объекта не определен констуктор копирования
Пишу шаблонный класс матриц. Делаю, значит, переопределение оператора + для двух матриц одного...

Указатель на абстрактный шаблонный класс
Есть абстрактный шаблон класса и 3 производных от него шаблонов классов. Так же есть шаблонная...

Указатель на бызовый абстрактный класс.
Правильно ли у меня написан &quot;умный&quot; указатель? Напонятно, как можно с помощью указателя на базовый...

Изменить класс для описания комплексных чисел на абстрактный класс
Нужно изменить на абстрактное классы, не понимаю как? В файле Class1.cs: using System; using...


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

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

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