0 / 0 / 0
Регистрация: 14.04.2011
Сообщений: 3
1

Абстрактные классы, наследование

14.04.2011, 16:21. Показов 9254. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Задание: Написать базовый абстрактный класс «фигура» (с чистыми виртуальными функциями: нарисовать, передвинуть, повернуть) и два класса наследника окружность и квадрат, с различной реализацией этих функций. В основной программе создать массив указателей базового класса на объекты классов наследников. Передвинуть все объекты на одинаковое расстояние.

Помогите плиз, кто чем может=)

Добавлено через 2 часа 9 минут
Up, все еще нужна помощь...Заоранее благодарен
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.04.2011, 16:21
Ответы с готовыми решениями:

Наследование, абстрактные классы.
Собственно нужно создать абстрактный базовый класс Shape, от него наследовать абстрактные классы...

Наследование и абстрактные классы
расскажите что это и с чем это едят......... а то как то встал на этом!!!

Абстрактные классы. Наследование
Здравствуйте! Препод дал задание на наследование и абстрактные классы. Кому не трудно, посмотрите,...

Абстрактные классы, наследование, утечка памяти
Есть следующий код: #include <iostream> #include <cmath> using namespace std; class CShape {...

16
Заблокирован
14.04.2011, 16:36 2
Дейтель, Харви и Пол. Как программировать на С++
Глава 10.9. Очень близкий пример.
1
2848 / 1997 / 986
Регистрация: 21.12.2010
Сообщений: 3,705
Записей в блоге: 10
14.04.2011, 18:50 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
#include<iostream>
#include<windows.h>
 
class Shape{
    protected:
        int rotated;
        int shifted;
    public:
        Shape():rotated(0), shifted(0){}
        virtual void Draw(int)=0;
        virtual void Rotate(int)=0;
        virtual void Shift(int)=0;
        int GetRotated(){return rotated;}
        int GetShifted(){return shifted;}
};
 
class Square:public Shape{
    private:
        int length;
    public:
        Square():Shape(), length(0){}
        void Draw(int);
        void Rotate(int);
        void Shift(int);
        int GetLength(){return length;}
};
 
void Square::Draw(int ini){
    length=ini;
    std::cout<<"Нарисован квадрат со стороной "<<ini<<"\n";
}
void Square::Rotate(int ini){
    rotated+=ini;
    std::cout<<"Квадрат повёрнут на "<<ini<<"\n";
}
void Square::Shift(int ini){
    shifted+=ini;
    std::cout<<"Квадрат сдвинут на "<<ini<<"\n";
}
 
int main(){
    SetConsoleOutputCP(1251);
    int size=3;
    Shape* arr[size];
    for(int i=0; i<size; i++){
        arr[i]=new Square();
        arr[i]->Draw(10);
        arr[i]->Shift(5);
    }
    for(int i=0; i<size; i++){
        delete arr[i];
        arr[i]=NULL;
    }
    return 0;
}
1
0 / 0 / 0
Регистрация: 14.04.2011
Сообщений: 3
15.04.2011, 15:47  [ТС] 4
Благодарю, но возник еще вопросик...
Компилятор ругается на строчку
C#
1
Shape* arr[size];
Пишит что хочет константное вырожение, ну если сделать константу то все работает, а как сделать не константой?
0
║XLR8║
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
15.04.2011, 16:06 5
C++
1
Shape *arr = new Shape[size];
1
Эксперт С++
623 / 467 / 57
Регистрация: 28.01.2011
Сообщений: 605
15.04.2011, 16:09 6
outoftime, тогда скорее вот так
C++
1
Shape ** arr = new Shape*[size];
1
64 / 64 / 8
Регистрация: 27.01.2011
Сообщений: 250
15.04.2011, 16:25 7
Для справки первый вариант не работает=) Второй нормальный=)
1
0 / 0 / 0
Регистрация: 14.04.2011
Сообщений: 3
15.04.2011, 16:25  [ТС] 8
Спасибо всем=) Все работает
0
Эксперт С++
623 / 467 / 57
Регистрация: 28.01.2011
Сообщений: 605
15.04.2011, 16:25 9
Norka, не забудьте только потом соответствующие delete для освобождения памяти поставить.
0
║XLR8║
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
15.04.2011, 16:38 10
Ma3a, не знаешь, если есть вектор
C++
1
vector<vector<Cell *>> *m_cells;
Можно освобождать его так:
C++
1
m_cells->clear();
Или надо очищать вручную все указатели на классы? (точнее память под классы, на которые указывают указатели)
0
Эксперт С++
623 / 467 / 57
Регистрация: 28.01.2011
Сообщений: 605
15.04.2011, 16:43 11
outoftime, очищать указатели надо вручную.

Добавлено через 3 минуты
или как вариант сделать std::vector<std::vector<std::auto_ptr<Cell> > >, тогда можно и вызовом clear() очищать, при очистке вектора будут вызваны деструкторы для каждого auto_ptr и память из под объектов освободится автоматически.
0
Эксперт С++
3224 / 1751 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
15.04.2011, 16:51 12
Цитата Сообщение от Ma3a Посмотреть сообщение
или как вариант сделать std::vector<std::vector<std::auto_ptr<Cell> > >, тогда можно и вызовом clear() очищать, при очистке вектора будут вызваны деструкторы для каждого auto_ptr и память из под объектов освободится автоматически.
Объекты std::auto_ptr нельзя хранить в стандартных контейнерах из-за побочных эффектов при их копировании и писваивании.
0
║XLR8║
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
15.04.2011, 16:53 13
Ma3a, А можно как-то модифицировать вызов деструкторов, что-бы удалять данный по ссылке?
0
Эксперт С++
623 / 467 / 57
Регистрация: 28.01.2011
Сообщений: 605
15.04.2011, 16:55 14
Mr.X, точно, совсем из головы вылетело
тогда насколько я знаю только boost::shared_ptr поможет

Добавлено через 2 минуты
outoftime, не слишком ясно, о чем вы, но если по поводу моего поста с auto_ptr, то это я погорячился, лучше оставьте пока обычные указатели и потом просто вручную освободите указатели.
0
║XLR8║
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
15.04.2011, 21:45 15
Можете пример с boost::shared_ptr навести?
0
Эксперт С++
623 / 467 / 57
Регистрация: 28.01.2011
Сообщений: 605
15.04.2011, 22:08 16
В целом по работе похоже на auto_ptr, только реализован изнутри он по-другому и там подсчет ссылок есть
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void DoSmth()
{
    typedef boost::shared_ptr<int> SPtr;
 
    std::vector<SPtr> vect;
 
    // довавление элементов в вектор...
    SPtr p(new int(1));
    vect.push_back(p);
 
    p.reset(new int(2));
    vect.push_back(p);
    ...
    // получение объекта из shared_ptr
    int i = *p.get();
    ...
} // а здесь всё нормально очищается, даже если где-то при операциях возникло исключение
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
15.04.2011, 22:16 17

Не по теме:

человек динамические массивы не осилил, а вы shared_ptr


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <memory>
#include <iostream>
#include <vector>
 
#define I_D std::cout << __FUNCTION__ << " (" << __LINE__ << ") " << __FILE__ << " " << std::endl;
 
class A
{
public:
   A(){ I_D; }
   ~A(){ I_D; } 
};
 
int main()
{
   std::vector<std::shared_ptr<A> > v
      = {
          std::shared_ptr<A>(new A),
          std::shared_ptr<A>(new A),
          std::shared_ptr<A>(new A),  
        };
}
0
15.04.2011, 22:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.04.2011, 22:16
Помогаю со студенческими работами здесь

Наследование: Чистые Виртуальные функции и Абстрактные классы
Добрый вечер помогите пожалуйста вывести на экран то что мы вводим с клавиатуры ( int s , char d )...

Автоматическая генерация классов С ++ с UML диаграмм классов. Наследование в с++. Абстрактные классы. WhiteStarUML
Создать классовую модель(желательно в WhiteStarUML), которая включает в себя абстрактный класс...

Абстрактные классы
Помогите пожалуйста с программой. Создать абстрактный класс Body. На его основе реализовать классы...

Абстрактные классы
Есть 3 абстракции, линия(бесконечная), луч(бесконечен в одну сторону) и отрезок (ограничен)....


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru